将re中的€符号与python匹配

时间:2014-08-08 18:55:16

标签: python regex python-2.7

我正在尝试匹配字符串中的€符号但是在使用特殊字符“?”时我会遇到一种奇怪的行为。它按预期正常工作

import re

print re.match(r'a?1', 'a1')
<_sre.SRE_Match object at 0x3a2ba58>

print re.match(r'a?1', '1')
<_sre.SRE_Match object at 0x3a2ba58>

但是使用€符号我得到了这个输出

print re.match(r'€?1', '€1')
<_sre.SRE_Match object at 0x3a2ba58>

print re.match(r'€?1', '1')
None

有关正在发生的事情的任何想法?我怀疑它与unicode有关。 我正在使用python 2.7。 谢谢。

2 个答案:

答案 0 :(得分:2)

€不是ascii字符,因此您需要使用unicode匹配:

print re.match(ur'€?1', u'€1', flags=re.UNICODE)
<_sre.SRE_Match object at 0x7ffde0084bf8>

print re.match(ur'€?1', u'1', flags=re.UNICODE)
<_sre.SRE_Match object at 0x7ffde0084bf8>

答案 1 :(得分:1)

您会注意到问题已添加python2.7标记,因为此问题是特定于版本的。

默认情况下,Python假定您的源是UTF-8编码的。它将Euro符号视为UTF-8字节序列,在字符串中显示为单个字节:

>>> r'€?1'
'\xe2\x82\xac?1'

因此,您使用需要ASCII字节\xe2\x82的模式指定匹配,可选地由\xac字节跟随,最后是强制数字1

明确识别您的Unicode文字将解决问题。

>>> m = re.match(u'€?1', u'€1')
>>> m.start(), m.end()
(0, 2)
>>> m = re.match(u'€?1', u'1')
>>> m.start(), m.end()
(0, 1)

转到Python 3,解释器假定所有字符串文字都是Unicode,除非它们使用b'...'字面值显式标记为字节串,因此不会出现问题:

>>> r'€?1'
'€?1'
>>> m = re.match(r'€?1', '€1')
>>> m.start(), m.end()
(0, 2)