使用正则表达式查找 ü(带有变音符号的 u)
Finding ü (u with umlaut) using regular expressions
我正在使用以下包含 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
vs ü
)。为什么 #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编码的字符。
如果您无法选择要使用的刺针类型,您可以随时使用 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']
我觉得你在这里把自己弄糊涂了。您正在搜索的字符串显然不是 Unicode 字符串。
如果是,您将得到预期的 \u00fc
。
>>> import re
>>> m = re.search(ur'f(\xc3\xbc|\u0075|\u00fc)r', u'für')
>>> m.group(1)
u'\xfc'
您仍然需要满足 Unicode 等效性。 U+00FC is a regular u
followed by COMBINING DIAERESIS (U+0308). Probably you will want to run unicodedata.normalize('NFC', thing)
and make sure your regex always looks for the composed equivalent (or conversely go for 'NFD'
and fully decomposed); or perhaps switch to the regex
module 的完全分解等价物据称可以更好地处理这个问题。
如果您正在处理 UTF-8 并且您知道自己在处理 UTF-8,通常的建议是在将其读入 Python 后立即将其解码为 Unicode 字符串。参见例如http://nedbatchelder.com/text/unipain.html
我正在使用以下包含 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
vs ü
)。为什么 #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编码的字符。
如果您无法选择要使用的刺针类型,您可以随时使用 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']
我觉得你在这里把自己弄糊涂了。您正在搜索的字符串显然不是 Unicode 字符串。
如果是,您将得到预期的 \u00fc
。
>>> import re
>>> m = re.search(ur'f(\xc3\xbc|\u0075|\u00fc)r', u'für')
>>> m.group(1)
u'\xfc'
您仍然需要满足 Unicode 等效性。 U+00FC is a regular u
followed by COMBINING DIAERESIS (U+0308). Probably you will want to run unicodedata.normalize('NFC', thing)
and make sure your regex always looks for the composed equivalent (or conversely go for 'NFD'
and fully decomposed); or perhaps switch to the regex
module 的完全分解等价物据称可以更好地处理这个问题。
如果您正在处理 UTF-8 并且您知道自己在处理 UTF-8,通常的建议是在将其读入 Python 后立即将其解码为 Unicode 字符串。参见例如http://nedbatchelder.com/text/unipain.html