我把这个正则表达式的大部分都放下了,但是我在前瞻方面遇到了麻烦。我想将一个字符串分成一个邮政编码,然后是两个字符串或两个数字。数字可以是以下形式:
1
1.5
1.55
11.55
中间位的文本可以是“No minimum”,第三位的文本只能是“Free”。
E.g。
“YO1£10Free”==> YO1; 10;免
或
“yo1£8££0.5”==> YO1; 8; 0.5
或
“yo1No最低£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搜索中添加'或text等于“No minimum”'。我也无法包括前瞻。最后添加它不起作用:
(?<=\xc2)
任何帮助都将不胜感激。
答案 0 :(得分: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复制的原始字符串似乎是一个字节串,我不得不将其解码为unicode(参见byte string vs. unicode string. Python)。我认为你可能会遇到unicode编码错误 - 符号是一个经典的标志。
然后我使用re.UNICODE标志使你的正则表达式对unicode友好。这意味着您可以使用\ w表示“字母数字”,并使用\ n来表示“数字”,这是以unicode友好的方式。
http://docs.python.org/2/library/re.html#module-re
由于正则表达式经常被误认为是线路噪音,所以lemme解压缩:
u"^(\w{3}.*)\s+(\d+\.?\d*)(\w+)$"
这肯定不是我写过的最漂亮的正则表达式,但希望它足以让你开始。