我试图在字符串中匹配欧元符号,但当使用特殊字符"?“时,我会有一种奇怪的行为。它与正常字符的工作方式相同。
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。谢谢。
发布于 2014-08-08 18:59:50
欧元不是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>发布于 2014-08-08 20:12:43
您会注意到问题已经添加了python2.7标记,因为这个问题是特定于版本的。
默认情况下,Python假定您的源代码将被UTF-8编码。它将欧元符号视为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)转到Python3时,解释器假设所有字符串文本都是Unicode,除非使用b'...'文字显式地将字符串标记为字节串,因此不会出现问题:
>>> r'€?1'
'€?1'
>>> m = re.match(r'€?1', '€1')
>>> m.start(), m.end()
(0, 2)https://stackoverflow.com/questions/25210429
复制相似问题