【问题标题】:Python regex lookahead non-ASCII characterPython 正则表达式前瞻非 ASCII 字符
【发布时间】:2012-11-21 13:19:51
【问题描述】:

我已经完成了大部分的正则表达式,但是我在前瞻方面遇到了麻烦。我想将一个字符串分隔成一个邮政编码,后跟两个字符串或两个数字。数字可以是以下形式:

1
1.5
1.55
11.55

中间位的文字可以是“No minimum”,第三位的文字只能是“Free”。

例如

"YO1£10Free" ==> YO1; 10个;免费

"yo1£8£0.5" ==> yo1; 8个; 0.5

"yo1 没有最低 0.75 英镑" ==> yo1;没有最低要求; 0.75

我已经完成了第一步:

string = "YO1£ 10Free"
patternPostCode = re.compile("[a-zA-Z]{1,2}[0-9][a-zA-Z0-9]?")
postCode = re.findall(string,patternPostCode)

字符串中的数字是通过以下方式找到的:

patternCost = re.compile(r"(?<=\xa3 )([0-9]|  
[0-9][0-9]|  
[0-9]?[0-9]?.[0-9]|
[0-9]?[0-9]?.[0-9][0-9])")

我很难将“或文本等于“无最小值””添加到 patternCost 搜索。我也无法设法包括前瞻。最后添加这个不起作用:

(?<=\xc2)

任何帮助将不胜感激。

【问题讨论】:

    标签: python regex lookahead


    【解决方案1】:

    我在 Python 2.7 上想出了这个:

    # -*- coding: utf-8 -*-
    import re
    
    raw_string = "YO1£ 10.01Free"
    string = raw_string.decode('utf-8')
    patternPostCode = re.compile(u"^(\w{3}.*)\s+(\d+\.?\d*)(\w+)$",flags=re.UNICODE)
    postCode = patternPostCode.findall(string)
    
    print postCode
    print u'; '.join(postCode[0])
    

    这会返回:

    [(u'YO1\xc2\xa3', u'10.01', u'Free')]
    YO1£; 10.01; Free
    

    首先,我从 SO 复制的原始字符串似乎是一个字节字符串,我必须将其解码为 un​​icode(参见 byte string vs. unicode string. Python)。我认为您通常可能遇到 unicode 编码错误 - Â 符号就是一个典型的例子。

    然后,我使用 re.UNICODE 标志使您的正则表达式对 unicode 友好。这意味着您可以使用 \w 来表示“字母数字”和 \d 以 unicode 友好的方式表示“数字”。

    http://docs.python.org/2/library/re.html#module-re

    由于正则表达式经常被误认为是线路噪音,请让我为您解压:

    u"^(\w{3}.*)\s+(\d+\.?\d*)(\w+)$"
    
    • ^ = 行首
    • (\w{3}.*) = 完全匹配三个字母数字字符 (\w{3}),后跟任何内容 (.*) 并分组(这是整个内容的括号)。我一般不喜欢 .*,但有必要抓住 £ 垃圾。如果您不想要它,请将其移到括号外。
    • \s+ - 至少一个空格。我们会把它扔掉
    • (\d+.?\d*) - 匹配一位或多位数字,后跟可选的句点,后跟可选的一位或多位数字。这将匹配 10、10.、10.0、10.0000 等等。
    • (\w+) - 一个或多个字母数字字符
    • $ - 匹配行尾

    这肯定不是我写过的最漂亮的正则表达式,但希望它足以让你入门。

    【讨论】:

    • 谢谢瑞秋,这确实有很大帮助。正则表达式非常令人生畏,所以感谢您的解释!为 unicode 提示干杯,这让我很头疼!
    • 哇!我很高兴它对你有所帮助。 Unicode 在 Python 2 中是个麻烦事,这个 Pycon 视频帮助我开始了解它:youtube.com/watch?v=sgHbC6udIqc
    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2015-09-13
    • 2016-06-08
    • 2011-10-25
    相关资源
    最近更新 更多