Python re和regex:search()与非ASCII字符的相同字符串不匹配

时间:2016-01-19 22:08:18

标签: python regex unicode

尝试使用re或regex将非ASCII字符串与其自身匹配。我已经阅读了有关非ASCII / unicode的其他帖子,并尝试添加unicode标志,但无济于事:

ptrdiff_t

我希望我错过了一些明显的东西。任何帮助非常感谢!

1 个答案:

答案 0 :(得分:2)

请注意,作为正则表达式模式,s2内部有at at_end模式。

In [62]: re.compile(s2, re.DEBUG)
literal 226
literal 132
literal 155
...
at at_end
...
literal 226
literal 132
literal 144

这是因为,作为utf-8编码的字符串,s2

In [61]: s2 = 'ℛℯα∂α♭ℓℯ ♭ʊ☂ η☺т Ѧ$☾ℐℐ'
In [72]: s2
Out[72]: '\xe2\x84\x9b\xe2\x84\xaf\xce\xb1\xe2\x88\x82\xce\xb1\xe2\x99\xad\xe2\x84\x93\xe2\x84\xaf \xe2\x99\xad\xca\x8a\xe2\x98\x82 \xce\xb7\xe2\x98\xba\xd1\x82 \xd1\xa6$\xe2\x98\xbe\xe2\x84\x90\xe2\x84\x90'

并注意$中有s2

In [75]: '$' in s2
Out[75]: True

要防止将$解释为at at_end模式,请使用re.escape转义模式中的所有非字母数字字符:

In [67]: pat = re.compile(re.escape(s2))

In [68]: pat.search(s2)
Out[68]: <_sre.SRE_Match at 0x7feb6b44dd98>

转义unicode模式同样如此:

In [78]: us2 = unicode(s2,'utf-8')

In [79]: re.search(re.escape(us2), us2)
Out[79]: <_sre.SRE_Match at 0x7feb6b44ded0>

因为

In [81]: u'$' in us2
Out[81]: True