我正在使用以下包含 letter ü 的文本片段:
test für fur test
代码如下:
import re
for m in re.finditer(r, line, re.IGNORECASE | re.UNICODE):
print 'match: ', m.group(0)
print 'offset: ', m.start()
还有三个正则表达式:
r = ur'\bf(\u0075)r\b' # finds 'fur', as expected
r = ur'\bf(\xc3\xbc)r\b' # finds 'für', as expected
r = ur'\bf(\u00FC)r\b' # does not find 'für'
表达式#1 和#3 相似;唯一的区别是 Unicode 点(u
与 ü
)。为什么 #3 不起作用?
我可以使用#2,但它的可读性较差。
最佳答案
这是我的测试结果。
>>> print re.findall(ur'\bf(\u0075)r\b', "test für fur test", re.I|re.U)
['u']
>>> print re.findall(ur'\bf(\xc3\xbc)r\b', "test für fur test", re.I|re.U)
['\xc3\xbc']
>>> print re.findall(ur'\bf(\u00FC)r\b', "test für fur test", re.I|re.U)
[]
这些与您的结果完全匹配。我注意到第二种情况的匹配项是 ['\xc3\xbc']
,这让我大吃一惊。 "test für fur test"
是一个非 unicode 字符串。
这是我使用 unicode 字符串进行的第二组测试。
>>> print re.findall(ur'\bf(\u0075)r\b', u"test für fur test", re.I|re.U)
[u'u']
>>> print re.findall(ur'\bf(\xc3\xbc)r\b', u"test für fur test", re.I|re.U)
[]
>>> print re.findall(ur'\bf(\u00FC)r\b', u"test für fur test", re.I|re.U)
[u'\xfc']
正则表达式匹配字符串中的二进制表示。所以unicode字符串匹配unicode字符,非unicode字符串匹配UTF-8编码的字符。
如果您无法选择要使用的 sting 类型,您始终可以使用 unicode()
。
>>> print re.findall(ur'\bf(\u00FC)r\b', unicode("test für fur test", "utf-8"), re.I|re.U)
[u'\xfc']
在你的情况下
for m in regex.finditer(r, unicode(line, "utf-8"), regex.IGNORECASE | regex.UNICODE):
print 'match: ', m.group(0)
print 'offset: ', m.start()
注意
根据 .py 文件的文件编码,ur'\bf(ü)r\b'
也应该有效。
>>> print re.findall(ur'\bf(ü)r\b', u"test für fur test", re.I|re.U)
[u'\xfc']
关于regex - 使用正则表达式查找 ü(带有变音符号的 u),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36715487/