【问题标题】:Match the € symbol in re with python将 re 中的 € 符号与 python 匹配
【发布时间】:2014-08-08 18:55:15
【问题描述】:

我正在尝试匹配字符串中的 € 符号,但在使用特殊字符“?”时出现了奇怪的行为。它可以正常使用正常字符

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。 谢谢。

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    €不是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>
    

    【讨论】:

    • 我已经尝试过 print re.match(ur'€?1', u'1') 我没有发布它,因为它不起作用。之后我意识到这是我的 IDE 中嵌入的控制台的问题。 print re.match(ur'€?1', u'1') 按预期工作。无论如何感谢您的帮助!
    【解决方案2】:

    您会注意到该问题已添加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)
    

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2011-01-09
      • 2013-03-05
      相关资源
      最近更新 更多