正则表达式给出了英语和俄语的不同结果

时间:2016-01-06 12:02:51

标签: python regex pyre2

所以,我有这个正则表达式:

[ ]{1}[^\w]*(шесть)[^\w]*[ ]{1}

它的变体:

[ ]{1}[^\w]*(conservation)[^\w]*[ ]{1}

我使用此文本here来测试它:

  

“”“Наверное,поодномунапаруотделений,аихбольшедесяти。   Интересно,каждыйработаетпошестьчасоввнеделю? Работать,   очевидно,некому,разпринимаютсамизаведующие。 Нонеужелиэкономия   нанесколькихдиагностах“”“

     

“”在9月份麦金莱总统被暗杀之后   1901年,42岁的罗斯福成为最年轻的美国   历史上的总统。领导他的党和国家进入   进步时代,他支持他的“Square Deal”国内政策,   承诺平均公民公平,打破信任,监管   铁路,纯食品和药品。使保护成为一个顶级   优先,他建立了无数新的国家公园,森林,和   旨在保护国家自然资源的纪念碑。在   外交政策,他专注于中美洲,在那里他开始   建造巴拿马运河。他大大扩展了曼联   美国海军,并派遣大白舰队进行世界巡回演出   美国的海军力量遍布全球。他成功了   结束日俄战争的努力为他赢得了1906年的诺贝尔和平   奖 “”“

两者都是我发现的随机文本。但这不是重点。

使用第一个正则表达式时,我得到以下匹配项:

  

поодномунапаруотделений,аихбольшедесяти。 Интересно,каждый   работаетпошестьчасоввнеделю? Работать,очевидно,некому,раз   принимаютсамизаведующие。 Нонеужелиэкономиянанескольких

这是第一个文本块,俄文版。

在第二个中,它只匹配

  

шесть

比赛的背景是

  

......新的国家公园...

如果我使用英语单词,例如“conservation”,它只匹配英语文本块中的单词。

如果我将其添加到俄语文本中,例如:

  

...шестьconservationhчасов......

它匹配相同的大块文本,例如“шесть”。

为什么会这样?是因为文本是俄文吗?

我不是百分之百确定这个正则表达式的作用,但在英文文本中它在括号中找到了这个词。我认为它对其他语言也是如此。

这并不重要,但是我正在使用Python 2.7的re2库。但是,由于我在网上获得了相同的结果,我认为这是我不理解的正则表达式或非英语文本的一些问题。

谢谢!

编辑1:

代码:

source = the_text_above
term = "шесть"
expression = regex_builder(term) # This returns the regex I posted
compiled_pattern = re2.compile(expression, re2.IGNORECASE, re2.U) # This raises an error: RegexError: pattern too large - compile failed
compiled_pattern.search(source).span() # This returns the start and end of the chunk of text I mentioned.

编辑附录1:当我不使用re2.U时返回文本块

编辑2:

我也尝试过:

compiled_pattern = re.compile(expression, re.U)

我得到了相同的结果。

编辑3 - 已解决:

所以,我尝试用re2.IGNORECASE和re2.U标志再次编译它并且它有效。

现在我的代码看起来像这样:

source = the_text_above
term = "шесть"
expression = regex_builder(term)
compiled_pattern = re2.compile(expression, re2.IGNORECASE | re2.U)
compiled_pattern.search(source).span()

就像这样。

2 个答案:

答案 0 :(得分:2)

在RE2中,如果您未指定\w标志,则re2.U仅匹配ASCII字母:

  

\w个字符(≡[0-9A-Za-z_]

因此[^\w]匹配西里尔字母。

因此,您需要使用re2.U标志。

由于您将re2.Ire2.U合并,因此需要在中间使用按位OR(|):

re2.compile(<YOUR_PATTERN>, re2.I | re2.U) 

答案 1 :(得分:0)

我使用Python 2.7.10和re模块没有错误:

import re
txt_ru = u"""Наверное, по одному на пару отделений, а их больше десяти. Интересно, каждый работает по шесть часов в неделю? Работать, очевидно, некому, раз принимают сами заведующие. Но неужели экономия на нескольких диагностах"""
txt_en = u"""regulation of railroads, and pure food and drugs. Making conservation a top priority, he established myriad new шесть national parks, forests,"""
expression = u"[ ]{1}[^\w]*(шесть)[^\w]*[ ]{1}"
m_ru = re.search(expression, txt_ru, re.UNICODE)
m_en = re.search(expression, txt_en, re.UNICODE)

输出:

In [166]: print m_ru.group(0)
 шесть 

In [167]: print m_en.group(0)
 шесть