python 正则表达式中的字素支持

Grapheme support in python regex

我正在使用很棒的 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 吗?是:

它通过将 Ä 定义为 unicode 字符来工作。

>>> print regex.match('.', u'Ä').group()
Ä
>>> print regex.match('\X', u'Ä').group()
Ä

Python 2 和 Python 3 之间的主要区别在于处理文本和字节的基本类型。在 Python 3 上,我们有一种文本类型:str,它包含 Unicode 数据和两种字节类型 bytes 和 bytearray。

另一方面,在 Python 2 上,我们有两种文本类型:str 就所有意图和目的而言,它仅限于 ASCII + 7 位范围以上的一些未定义数据,unicode 是相当于继承自Python 3.

的Python 3 str类型和1 byte类型的bytearray

参考 - https://docs.python.org/2/howto/unicode.html#python-2-x-s-unicode-support

问题是默认情况下 python2 字符串是字节字符串,这对 unicode 字素没有意义。如果您指定使用 unicode 字符串,它会完美地工作。

>>> print(regex.match('\X', 'Ä').group(0))

>>> print(regex.match('\X', u'Ä').group(0))
Ä

在 python3 中,默认字符串是 unicode,要指定字节字符串,您应该像这样 b b"mybytestring"