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

时间:2015-01-31 07:04:19

标签: python regex unicode grapheme

我正在使用令人敬畏的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的含义的理解是错误的?
  • 我需要先打开一些标志/开关吗? (我已搜索过文档,无法找到)
  • 与我的环境有什么关系? (Python 2.7.3,pip报告正则表达式== 2014.12.24)
  • 库中的错误?
  • 别的什么?

2 个答案:

答案 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"