我正在尝试匹配字符串中的€符号但是在使用特殊字符“?”时我会遇到一种奇怪的行为。它按预期正常工作
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。 谢谢。
答案 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)