我正在使用令人敬畏的regex模块,尝试其\X
字形支持。
首先,我尝试使用普通的.
>>> print regex.match('.', 'Ä').group(0)
>>> print regex.match('..', 'Ä').group(0)
Ä
按预期进行。转到\X
>>> print regex.match('\X', 'Ä').group(0)
>>> print regex.match('\X\X', 'Ä').group(0)
Ä
为什么它与.
相同?难道单个\X
不足以捕获A-umlaut吗?是吗:
\X
的含义的理解是错误的?答案 0 :(得分:4)
它的工作原理是将Ä
定义为unicode字符。
>>> print regex.match('.', u'Ä').group()
Ä
>>> print regex.match('\X', u'Ä').group()
Ä
Python 2和Python 3之间的主要区别在于处理文本和字节的基本类型。在Python 3上,我们有一种文本类型:str
,它包含Unicode数据和两个字节类型的字节和bytearray。
另一方面,在Python 2上,我们有两种文本类型:str
,对于所有意图和目的,仅限于ASCII + 7位范围以上的一些未定义数据,unicode等同于Python 3 str类型和一个字节类型的bytearray,它继承自Python 3。
参考 - https://docs.python.org/2/howto/unicode.html#python-2-x-s-unicode-support
答案 1 :(得分:3)
问题是默认情况下python2字符串是字节字符串,对于unicode字形没有意义。如果您指定使用unicode字符串,则完全可以正常工作。
>>> print(regex.match('\X', 'Ä').group(0))
>>> print(regex.match('\X', u'Ä').group(0))
Ä
在python3中,默认字符串是unicode,要指定字节字符串,你应该加b
这样的b"mybytestring"