2012-11-30 42 views
2

我已經看過並嘗試過關於此主題的前幾個問題的解決方案(herehere),但是我無法使其工作。Outward UK的Python正則表達式郵政編碼

我正在尋找一個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'] 
+0

感謝Zero的解釋和答案! – user578582

1

的問題是^$錨,其分別錨字符串的開始和結束,這意味着正則表達式將只匹配整個字符串。從每次交替(exp拆分|)中刪除它們,它將起作用。

+0

因此,從表達式中刪除所有^和$?我已經發布到文章描述,但它仍然沒有給我的郵政編碼。 – user578582

+0

@ user578582'|| '在表達中間看起來不正確;它應該是另一個'|'。 – ecatmur

+0

啊,你是對的。然而,該解決方案給出了一個很大的結果,如:('','','','','','','','','','','','','','' '','','','','AB15','AB1','5','','','','','','','','','') 。上面的答案是我認爲的竅門,但感謝您的幫助。 – user578582

相關問題