我已经查看并尝试了之前关于此主题的问题的解决方案(here和here),但我无法让它发挥作用。
我正在寻找UK postcode外部的正则表达式。在“PO1 1AF”中,PO1是向外邮政编码或邮政编码区,1AF是向内邮政编码。我有一长串的网址,其中一些网址末尾有一个外部邮政编码。
例如,我想要来自这两个字符串的“ab15”和“dd9”:
string1= "www.xyz.com/abcdab15/"
string2 = "www.xyz.com/adbdd9"
外部邮政编码are的排列:
A9
A9A
A99
AA9
AA9A
AA99
我尝试过前一个answer的解决方案,它既可以匹配内部,也可以匹配内部,但是它不会返回任何内容(答案是大写字母):
exp = '^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))) || ^((GIR)[ ]?(0AA))$|^(([A-PR-UWYZ][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][A-HJKS-UW0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][ABEHMNPRVWXY0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$'
import re
url1= "www.xyz.com/abcdAB15/"
url2 = "www.xyz.com/adbDD9"
postalCode = re.findall(exp,url1)
print postalCode[0]
以下是不含所有$和^锚点的表达式,如下所示:
exp = '((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))) || ((GIR)[ ]?(0AA))|(([A-PR-UWYZ][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))|(([A-PR-UWYZ][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))|(([A-PR-UWYZ][A-HK-Y0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))|(([A-PR-UWYZ][A-HK-Y0-9][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))|(([A-PR-UWYZ][0-9][A-HJKS-UW0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))|(([A-PR-UWYZ][A-HK-Y0-9][0-9][ABEHMNPRVWXY0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))'
答案 0 :(得分:1)
问题是^$
锚点,它们分别锚定字符串的开头和结尾,这意味着正则表达式只匹配整个字符串。从每次更改中删除它们(exp
上的|
分割),它将起作用。
答案 1 :(得分:1)
鉴于您列出外部邮政编码的可能性,可以将其描述为:
以正则表达式来说,这就是:
[a-z]{1,2}[0-9][a-z0-9]?
...但你只想在URL的末尾找到那个模式(可能后跟一个斜杠),所以我们将添加一个前瞻:
[a-z]{1,2}[0-9][a-z0-9]?(?=/?$)
您问题中的完整邮政编码正则表达式包含许多不同的排除项。例如,在某些地方看起来不允许使用V,Q和X,并且显然存在其他限制 - 我不会费心去尝试复制那些(阅读其他人的正则表达从来没有乐趣)......但是使用我们有什么:
>>> import re
>>> postcode = re.compile("[a-z]{1,2}[0-9][a-z0-9]?(?=/?$)")
>>> string1= "www.xyz.com/abcdab15/"
>>> string2 = "www.xyz.com/adbdd9"
>>> re.findall(postcode, string1)
['ab15']
>>> re.findall(postcode, string2)
['dd9']