Skip to main content
 首页 » 编程设计

python之混合语言单词的词尾正则表达式(在 python2 中)

2024年08月20日36haluo1

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

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

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

期望的结果:只捕获“boom”和“sam”中的“m”,而不是第一个单词中的“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) 

请您参考如下方法:

您需要使用 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 .