2

このトピックに関する以前の質問 (ここここ)の解決策を調べて試しましたが、うまくいきません。

UK postcodeの外側部分の正規表現を探しています。「PO1 1AF」では、PO1 が外向きの郵便番号または郵便番号地区で、1AF が内向きの郵便番号です。URL の長いリストがあり、そのうちのいくつかは末尾に外側の郵便番号があります。

たとえば、次の 2 つの文字列から「ab15」と「dd9」が必要です。

string1= "www.xyz.com/abcdab15/"
string2 = "www.xyz.com/adbdd9"

外側の郵便番号の順列は次のとおりです。

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}))'
4

2 に答える 2

2

外側の郵便番号についてリストした可能性を考えると、次のように説明できます。

  • 一文字か二文字
  • 数字が続く
  • オプションで文字または数字が続く

正規表現で言えば、これは次のとおりです。

[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']
于 2012-11-30T16:28:13.993 に答える
1

問題は^$、文字列の最初と最後をそれぞれ固定するアンカーです。つまり、正規表現は文字列全体にのみ一致します。それらを各交替(exp分割|)から削除すると、機能します。

于 2012-11-30T16:10:52.093 に答える