所以,我有这个正则表达式:
[ ]{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()
就像这样。
答案 0 :(得分:2)
在RE2中,如果您未指定\w
标志,则re2.U
仅匹配ASCII字母:
\w
个字符(≡[0-9A-Za-z_]
)
因此[^\w]
匹配西里尔字母。
因此,您需要使用re2.U
标志。
由于您将re2.I
与re2.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)
шесть