2

我正在使用很棒的正则表达式模块,尝试它的\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是错误的?
  • 我需要先打开一些标志/开关?(我查了文档,没找到)
  • 我的环境有什么问题吗?(Python 2.7.3,pip 报告 regex==2014.12.24)
  • 图书馆里的虫子?
  • 还有什么?
4

2 回答 2

4

它通过定义Ä为 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 的 str 类型和一个字节类型的 bytearray继承自 Python 3。

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

于 2015-01-31T07:26:24.700 回答
3

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

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

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

在 python3 中,默认字符串是 unicode,要指定字节字符串,您应该在前面加上b这样的b"mybytestring"

于 2015-01-31T07:27:09.847 回答