我正在尝试匹配我拥有的关键字列表,注意包含所有拉丁字符(例如重音符号)。
这是一个例子
import regex as re
p = r'((?!\pL)|^)blah((?!\pL)|$)'
print(re.search(p, "blah u"))
print(re.search(p, "blahé u"))
print(re.search(p, "éblah u"))
print(re.search(p, "blahaha"))
给出:
<regex.Match object; span=(0, 4), match='blah'>
None
None
None
这看起来是正确的。但是:
print(re.search(p, "u blah"))
给出:
None
这是错误的,因为我期望匹配“u blah”。
我也尝试过使用 re
模块中内置的 Python,但我无法让它与 \pL
或 \p{Latin}
由于“错误转义”错误。我还尝试过使用 unicode 字符串(不带“r”),但尽管向 \\\\pL
添加了斜杠,但我就是无法使其正常工作。
注意:我使用的是 Python 3.8
最佳答案
您的 ((?!\pL)|^)blah((?!\pL)|$)
正则表达式的问题在于 ((?!\pL)| ^)
组包含两个替代方案,其中第一个方案始终无法通过正则表达式(为什么?因为 (?!\pL)
是导致匹配失败的负向预测如果下一个字符是字母,并且下一个要匹配的字符是 blah
中的 b
),并且只有 ^
始终有效,即您的正则表达式等于 ^blah((?!\pL)|$)
并且仅匹配字符串的开头。
注意 (?!\pL)
已经匹配字符串末尾的位置,因此 ((?!\pL)|$)
= ( ?!\pL)
.
你应该使用
(?<!\pL)blah(?!\pL)
请参阅regex demo (出于演示目的切换到 PCRE)。
请注意,正则表达式的re
兼容版本是
(?<![^\W\d_])blah(?![^\W\d_])
请参阅regex demo .
关于Python Regex\pL 匹配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68929921/