2016-04-17 19 views
2

ich verwende Python 2.7.10 Operational System Ubuntu 15.04Regulärer Ausdruck funktioniert, wenn mit Hilfe eines Online-Tools getestet, aber funktioniert nicht, wenn in der Befehlszeile ausgeführt

Mein Ziel: Alle Spiele für einen regulären Ausdruck finden in eine gegebene Zeichenfolge.

Mein Problem: von mir entworfener regulärer Ausdruck stimmt nicht mit den beabsichtigten Wörtern überein, aber stimmt mit den Wörtern überein, die nicht übereinstimmen sollen.

Was diesen Fall ist das Besondere: Getestet habe ich meine regulären Ausdruck in Frage mit ein paar Online-regex Testanwendungen (https://regex101.com/#python UND http://pythex.org/) und meine regulären Ausdruck tut gut funktioniert passende nur die Worte, die ich brauche und diese Worte nicht passend Ich brauche keine. Es funktioniert jedoch völlig falsch, wenn es darum geht, es in der Befehlszeile auszuführen.

Bitte helfen Sie mir folgendes herauszufinden: - warum es funktioniert gut, während Sie online getestet werden und nicht funktioniert in Kommandozeile? - Wie kann ich meine Regex so verbessern, dass sie wie gewünscht funktioniert? Hier

ist der Code:

yuliaPattern = u'[Юю]л((ь(к\S*|ч\S*))|([яеию]\S*))+' 
yuliaCompiled = re.compile(yuliaPattern, re.I)] 
match = re_pattern.findall(text) 

das resultierende Spiel ist:

(u'\u044f\xbb,', u'', u'', u'\u044f\xbb,') 

oder in anderen Worten:

я», я», 

Auch ohne zu wissen, Russisch ist klar, dass somethingля etwas ganz anderes ist als "я", я und white-spaces.

Das beabsichtigte Ergebnis: Eigentlich sollte es überhaupt keine Übereinstimmungen in diesem Text geben.

Der reguläre Ausdruck ist: u'[Юю]л((ь(к\S*|ч\S*))|([яеию]\S*))+' Es ist beabsichtigt, die Worte von Ableitung zu entsprechen: Юля, Юлия, Юльчин, Юлька Groß- und Kleinschreibung

Der Text ist: Новости 15-00<br><br>1. Олланд пригрозил войной случае неуспеха переговоров Украине<br><br>В субботу французский лидер выступил мюнхенской конференции безопасности. Комментируя ситуацию Украине дипломатические усилия Парижа Берлина разрешению конфликта Донбассе, Олланд заявил, переговоры являются «одним последних шансов» достижения регионе. случае, долговременного решения кризиса будет, случится «известный сценарий – называется войной», заявил политик.<br><br>Читать далее: <br><br>2. Силовики нанесли 14 артиллерийских ракетных ударов территории ЛНР<br><br>Обстрелам подверглись населенные пункты Первомайск, Санжаровка, Красный Лиман, Обозное, Стаханов, Кировск, Райовка, район базы отдыха «Десюля», автомобильный мост трассе «Луганск — Станица Луганская» районе памятника князю Игорю. Зафиксировано применение крупнокалиберной ствольной артиллерии реактивных систем залпового огня «Град» «Ураган».<br><br>Читать далее: br><br>3. Басурин: переговоров интенсивность обстрелов Донецка увеличилась<br><br>Басурин отметил, встречи Порошенко канцлером Германии Ангелой Меркель президентом Франции Франсуа Олландом интенсивность обстрелов Донецка увеличилась, результате мирные жители провели одну беспокойную ночь.<br>Он обратил внимание то, начинаются переговоры представителями официального Киева, сразу резко растет количество жертв. Поэтому Басурин уверен, бойцы ВСУ умышленно нагнетают обстановку из-за нежелания договариваться перемирии.<br><br>Читать далее:

+3

Haben Sie versucht, rohe Saiten verwenden? Etwas wie 'ur' [ЮЮ] (((ь (к \ S * | \ \ S *)) | ([яеию] \ S *)) + ''für dein Muster. – zondo

+0

Sind Sie sicher, dass Ihre Variable 'text' den von Ihnen gelieferten Text enthält? Bitte geben Sie den vollständigen relevanten Code hier ein. –

+0

Wusste nicht, dass Python über die Befehlszeilenschnittstelle verfügt. Wie sieht der Befehlszeilencode aus? – sln

Antwort

1

Es ist eigentlich ein einziges Spiel in diesem Text, den du zitierst.

Ihre Regex findet, was es zu finden ist.
Sie sehen nicht nur das ganze Spiel.
Stattdessen betrachten Sie nur die Erfassungsgruppen.

Wenn Sie format Ihren Ausdruck würden Sie sehen, wie es sich auf das Spiel bezieht.

Das erste, was Sie feststellen werden, ist, dass [Юю]л außerhalb jeder Erfassungsgruppe ist, aber
ist Teil des gesamten Spiels, Gruppe 0.

[Юю] л 
(       # (1 start) 
     (       # (2 start) 
      ь 
      (к \S* | ч \S*)    # (3) 
    )        # (2 end) 
    | 
     ([яеию] \S*)    # (4) 
)+       # (1 end) 

Dies ist die eigentliche match result(mit Werkzeug) es findet:

** Grp 0 - (pos 700 , len 5) 
юля», 
** Grp 1 - (pos 702 , len 3) 
я», 
** Grp 2 - NULL 
** Grp 3 - NULL 
** Grp 4 - (pos 702 , len 3) 
я», 

Hier ist converted(mit Werkzeug)-\u Notation. Ähnlich aussehend?

** Grp 0 - (pos 700 , len 5) 
\u044E\u043B\u044F\u00BB, 
** Grp 1 - (pos 702 , len 3) 
\u044F\u00BB, 
** Grp 2 - NULL 
** Grp 3 - NULL 
** Grp 4 - (pos 702 , len 3) 
\u044F\u00BB, 

aktualisieren

Can you, please, also advise on how can I get only match group 0 as a result? – @OstapDidenko

[Юю] л 
(?: 
     ь 
     [кч] \S* 
    | 
     [яеию] \S* 
)+ 

Nutzung

re.findall(r'[Юю]л(?:ь[кч]\S*|[яеию]\S*)+', text, re.I) 

# ['юля»,'] 
+0

Vielen Dank! Jetzt verstehe ich, was passiert. Die Sache ist, dass ich nicht daran interessiert bin, die Gruppen 1-4 zu finden. Ich brauche stattdessen das ganze Spiel. Kannst du bitte auch beraten wie ich nur die Match Group 0 bekomme? –

+0

@OstapDidenko - Ein Update für Ihre Regex hinzugefügt. 'findall' gibt eine Liste und kein Match-Objekt zurück. Wenn Sie keine Capture-Gruppen haben (verwenden Sie Cluster-Gruppen, wenn Sie '(?: ..)') müssen, wird nur eine Liste von _group 0_-Funden zurückgegeben. Sehen Sie [hier] (https://howchoo.com/g/zdvmogrlngz/python-regexes-findall-search-and-match) zum Beispiel Verwendungen. – sln