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 吗?是:
- 我对字素或
\X
的理解有误吗?
- 有些flag/switch需要先开机吗? (我已经搜索了文档,找不到)
- 我的环境有问题? (Python 2.7.3, pip 报告正则表达式==2014.12.24)
- 库中有错误?
- 还有别的吗?
它通过将 Ä
定义为 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"
我正在使用很棒的 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
的理解有误吗? - 有些flag/switch需要先开机吗? (我已经搜索了文档,找不到)
- 我的环境有问题? (Python 2.7.3, pip 报告正则表达式==2014.12.24)
- 库中有错误?
- 还有别的吗?
它通过将 Ä
定义为 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.
参考 - 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"