那么,我有这个正则表达式:
[ ]{1}[^\w]*(шесть)[^\w]*[ ]{1}
还有一种变体:
[ ]{1}[^\w]*(conservation)[^\w]*[ ]{1}
我使用这段文本here来进行测试:
两段文本都是我随机找到的。但这不是重点。"""可能是每两个部门之间一个,而且他们有十多个。 很奇怪,每个人每周工作六小时吗?很明显,没有人工作, 否则自己的主管就不会接受。但是节约一些诊断费用难道不好吗?"""
"""1901年9月麦金利总统遭暗杀后,42岁的罗斯福成为美国历史上最年轻的总统。带领他的政党和国家进入进步时代,他提倡“平方交易”国内政策,承诺为普通公民提供公正、打破垄断、监管铁路以及纯净的食品和药物。他将保护环境置于优先位置,建立了无数新的六个国家公园、森林和纪念碑,旨在保护国家的自然资源。在外交政策上,他专注于中美洲,在那里开始修建巴拿马运河。他大大扩展了美国海军,并派遣大白舰队环游世界,展示美国在全球范围内的海军实力。他成功地结束了俄日战争,赢得了1906年的诺贝尔和平奖。"""
当使用第一个正则表达式时,会得到以下匹配结果:
这在第一块俄语文本中。可能是每两个部门之间一个,而且他们有十多个。很奇怪,每个 人每周工作六小时吗?很明显,没有人工作, 否则自己的主管就不会接受。但是节约一些诊断费用难道不好吗?
在第二个文本中,它只匹配
匹配的上下文为六个
如果我使用英语单词(例如"conservation"),那么它只会匹配英语文本中的该单词。...新的六个国家公园...
如果我将其添加到俄语文本中,比如这样:
它将与“六个”相同的大块文本匹配。...六个保护区的时间...
为什么会发生这种情况?是因为文本是俄语吗?
我不完全确定这个正则表达式的作用,但在英语文本中,它会找到括号中的单词。我认为它对其他语言也是如此。
虽然这并不重要,但是我使用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.
附加说明 EDIT 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()
它的工作方式如下。
re.U
标识符,\w
将匹配俄文字母,而\W
(如你的[^\w]
)将不再匹配西里尔字母。请参见 此演示。 - Wiktor Stribiżew