首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将re中的欧元符号与python匹配

将re中的欧元符号与python匹配
EN

Stack Overflow用户
提问于 2014-08-08 18:55:15
回答 2查看 950关注 0票数 2

我试图在字符串中匹配欧元符号,但当使用特殊字符"?“时,我会有一种奇怪的行为。它与正常字符的工作方式相同。

代码语言:javascript
复制
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>

但是用欧元符号,我得到了这个输出

代码语言:javascript
复制
print re.match(r'€?1', '€1')
<_sre.SRE_Match object at 0x3a2ba58>

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

知道怎么回事吗?我怀疑这和unicode有关。我用的是python 2.7。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-08 18:59:50

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

代码语言:javascript
复制
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>
票数 2
EN

Stack Overflow用户

发布于 2014-08-08 20:12:43

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

默认情况下,Python假定您的源代码将被UTF-8编码。它将欧元符号视为UTF-8字节的序列,这些字节以单个字节的形式出现在字符串中:

代码语言:javascript
复制
>>> r'€?1'
'\xe2\x82\xac?1'

因此,您使用一种模式指定了匹配,该模式要求ASCII字节\xe2\x82可选地后面跟着一个\xac字节,最后是一个强制数字1

显式地标识Unicode文本本身将解决这个问题。

代码语言:javascript
复制
>>> 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'...'文字显式地将字符串标记为字节串,因此不会出现问题:

代码语言:javascript
复制
>>> r'€?1'
'€?1'
>>> m = re.match(r'€?1', '€1')
>>> m.start(), m.end()
(0, 2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25210429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档