混合语言单词的最终正则表达式(在python2中)

时间:2017-03-24 08:42:14

标签: python regex unicode

我需要在英文和其他unicode字母组合的文本中找到一个正则表达式。

问题是 - 混合语言的单词边界不正确:

text: הmאפrקt boom sam
regex: m\b
also tried: m(?=\W)

期望的结果:只捕获“繁荣”和“山姆”中的“m”,而不是第一个单词。

然而,实际上,“m \ b”正则表达式匹配文本中的所有“m”字母。这是错误的(从我的角度来看),因为第一个“m”在一个单词的中间。

我设法使用这样一个丑陋的前瞻,这是一个有效的解决方案:

(?=$|[^a-zא-ת])

意思是:它看起来是句末或任何其他非英语 - 非希伯来字母,但不会消耗它。

但这不是一个完整的解决方案:它不涉及变音符号或其他语言的其他字母;

有没有更优雅的方法来处理python2正则表达式中混合的多语言单词边界?

我的代码示例:

text = ur"הmאפrקt boom sam"
result = re.sub(ur'm\b', 'X', text, flags=re.I+re.M+re.S)

result is: "הXאפrקt booX saX"
should be: "הmאפrקt booX saX"

溶液

感谢viktor的回答;只要所有字符串都是unicode:

text = re.sub(oldtext, replacement, text, flags=re.UNICODE)

1 个答案:

答案 0 :(得分:3)

您需要使用re.UNICODE标志编译正则表达式,以使\b支持Unicode。另外,请记住,您使用的所有字符串都必须是Unicode。

以下是修复替换代码的方法:

# -*- coding: utf-8 -*-
import re
text = ur"הmאפrקt boom sam"
result = re.sub(ur'm\b', u'X', text, 0, re.UNICODE).encode("utf8")
print(result)

请参阅online Python 2 demo

以下是匹配的代码段:

# -*- coding: utf-8 -*-
import re
s = "הmאפrקt sam"
match = re.search(ur'\w*m\b', s.decode('utf8'), flags=re.UNICODE)
if match:
    print(match.group(0).encode("utf8"))

re.findall的示例证明只有一个匹配:

print([x.encode("utf8") for x in re.findall(ur'\w*m\b', s.decode('utf8'), flags=re.UNICODE)])
# => ['sam']

请参阅Python 2 online demo