【问题标题】:Regular expression works when tested with online tools, but does not work when executed in command line正则表达式在使用在线工具测试时有效,但在命令行中执行时无效
【发布时间】:2016-04-17 22:05:57
【问题描述】:

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

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

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

这个案例的特别之处:我用一些在线正则表达式测试应用程序(https://regex101.com/#python AND http://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>Читать далее:

【问题讨论】:

  • 你试过使用原始字符串吗?像ur'[Юю]л((ь(к\S*|ч\S*))|([яеию]\S*))+' 这样的模式。
  • 您确定您的text 变量包含您提供的文本吗?请在此处发布完整的相关代码。
  • 不知道 Python 有命令行界面。命令行代码是什么样的?
  • @zondo,谢谢,我试过了,没有帮助。伙计们,谢谢你们的cmets。 sIn 在下面给了我一个很好的答案。现在我可以看到问题所在了。
  • @sln python -c "print('hello world')" 可能会被认为是命令行 python。

标签: python regex unicode cyrillic


【解决方案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)

# ['юля»,']

【讨论】:

  • 非常感谢!现在我明白会发生什么了。问题是我对匹配组 1-4 不感兴趣。我需要整场比赛。能否请您也建议我如何才能获得仅匹配组 0 的结果?
  • @OstapDidenko - 为您的正则表达式添加了更新。 findall 返回一个列表,而不是匹配对象。如果您没有捕获组(如果必须(?:..),请使用集群组)它只会返回 group 0 找到的列表。请参阅here 了解示例用法。
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多