1

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

1
1.5
1.55
11.55

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

例如

“YO1£ 10Free” ==> YO1;10个;自由

或者

"yo1 8 英镑 0.5" ==> yo1; 8个;0.5

或者

"yo1No minimum£ 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)

任何帮助,将不胜感激。

4

1 回答 1

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+) - 一个或多个字母数字字符
  • $ - 匹配行尾

这当然不是我写过的最漂亮的正则表达式,但希望它足以让你开始。

于 2012-12-04T02:21:55.813 回答