Вот мои результаты.
>>> 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"
- строка, отличная от юникода.
Здесь был мой второй набор тестов с юникодными строками.
>>> 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 соответствуют символам Юникода, а строки, отличные от юникода, соответствуют кодированным символам 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']
Я только что сопоставил 'für' с вашим Regex 3. Не знаю, почему это не работает на вашей стороне. –