外向英国邮政编码的 Python 正则表达式

Posted

技术标签:

【中文标题】外向英国邮政编码的 Python 正则表达式【英文标题】:Python Regular Expression for Outward UK Post Code 【发布时间】:2012-11-30 16:04:20 【问题描述】:

我已经查看并尝试了有关此主题的先前问题的解决方案(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))'

【问题讨论】:

【参考方案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']

【讨论】:

感谢零的解释和回答!【参考方案2】:

问题在于^$ 锚点,它们分别锚定字符串的开头和结尾,这意味着正则表达式只会匹配整个字符串。从每个交替中删除它们(exp| 上拆分),它将起作用。

【讨论】:

那么从表达式中删除所有 ^ 和 $?我已将其发布到文章描述中,但它仍然没有给我邮政编码。 @user578582 `|| ` 在表达式中间看起来不正确;它应该只是另一个| 啊,没错。但是,该解决方案会产生很大的结果,例如: ('', '', '', '', '', '', '', '', '', '', '', '', '', ' ','','','','AB15','AB1','5','','','','','','','','','') .我认为上面的答案可以解决问题,但感谢您的帮助。

以上是关于外向英国邮政编码的 Python 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

英国邮政编码正则表达式验证

使用正则表达式验证英国邮政编码

正则表达式匹配英国邮政编码的前半部分

带空格的英国邮政编码正则表达式

英国邮政编码的正则表达式

C# - 英国邮政编码正则表达式没有按预期工作?