正则表达式在使用联机工具进行测试时有效,但在命令行中执行时不起作用

时间:2016-04-17 22:05:58

标签: python regex unicode cyrillic

我正在使用Python 2.7.10 操作系统Ubuntu 15.04

我的目标:找到给定字符串中正则表达式的所有匹配项。

我的问题:由我设计的正则表达式与预期的单词不匹配,但匹配它不打算匹配的单词。

这个案例的特别之处:我使用一些在线正则表达式测试应用程序(https://regex101.com/#pythonhttp://pythex.org/)测试了我的正则表达式,我的正则表达式确实有效只匹配我需要的那些词而不匹配那些我不需要的词。但是,在命令行中执行它时,它完全错误。

请帮我弄清楚以下内容:   - 为什么它在网上测试时效果很好而且无效    命令行?   - 如何改进我的正则表达式以使其按预期工作?

以下是代码:

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

结果匹配为:

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

或其他方面:

я»,   я»,

即使不了解俄语也明白Юля与“я”,“я”和“白色空间”有很大不同。

预期结果:实际上,本文中根本不应有任何匹配。

正则表达式u'[Юю]л((ь(к\S*|ч\S*))|([яеию]\S*))+' 它旨在匹配源自以下的词:Юля,Юлия,Юльчин,Юлька不区分大小写

文字Новости 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>Читать далее:

1 个答案:

答案 0 :(得分:1)

您引用的文字实际上只有一个匹配项。

你的正则表达式正在寻找它的内容 你只是不看整场比赛 相反,你只是看着捕获组。

如果你format你的表达,你可以看到它与比赛的关系。

你会注意到的第一件事是[Юю]л在任何捕获组之外,但是 是整场比赛的一部分,第0组。

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

这是它找到的实际match result (带工具)

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

这是converted (带工具)\u表示法。看起来熟悉?

 **  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,  

更新

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

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

用法

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

# ['юля»,']