python - 正则表达式在使用在线工具测试时有效,但在命令行中执行时无效

标签 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>Читать далее:

最佳答案

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

您的正则表达式正在寻找它要寻找的东西。
你只是没有看到整场比赛。
相反,您只是在查看捕获组。

如果你愿意 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,  

更新

能否请您也告诉我如何才能只获得匹配组 0? – @OstapDidenko

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

用法

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

# ['юля»,']

关于python - 正则表达式在使用在线工具测试时有效,但在命令行中执行时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36682754/

相关文章:

python - Django 1.11 - 如何确保 TruncYear 生成 Zulu 时间

python - 有没有办法清理jinja2产生的html?

javascript - 括号之间和包括括号的内容的正则表达式

javascript - 正则表达式匹配由\n分隔的字符串中的一系列数字(它只是一个字符串)

python - 如何加载包含带有 unicode 字符的字典的 pickle 文件?

python - 在创建方法 django rest 框架中引发错误

python - botocore:如何关闭或清理 session 或客户端

java - 我想构建一个邮政编码处理程序,它将删除邮政编码中的所有非数字字符并打印格式化的邮政编码

python - 字符\u260e

hadoop - Hive 中的 Unicode 数据支持