2011-09-15 11 views
2

次の文字列から郵便番号(米国)を「抽出する」方法は?正規表現米国の郵便番号を取得

import re 
address = "Moab, UT 84532" 
postal_code = re.match('^\d{5}(-\d{4})?$', address) 
print postal_code 
+1

リンクを参照してください[http://regexlib.com/REDetails.aspx?regexp_id=2](http://regexlib.com/REDetails.aspx?regexp_id=2) – Prasanth

答えて

7

まず、あなたは文字列の先頭からのみ一致する試合を、使用している:でも、あなたが検索を使用していた場合、あなたは5を含むグループをつかんされていない、またhttp://docs.python.org/library/re.html#matching-vs-searching

見ますそこにいることが保証されている数字。

最後に、あなたが検索を使っていたとしても、カラットで正規表現を始めると^が最初から検索されます。あなたのケースでは明らかに動作しません。郵便番号を想定し

>>> postal_code = re.search(r'.*(\d{5}(\-\d{4})?)$', address) 
>>> postal_code.groups() 
('84532', None) 
+0

Sberry、なぜあなたは含まれませんあなたの検索パターンの '。\ *'? '。\ *'はアドレスの "Moab、UT"部分と一致しませんので、検索はMoab、UT 84532 ""と一致するでしょうか?現在、Pythonを使用しているコンピュータにはアクセスできません。私はそれをテストすることはできませんが、あなたのパターンにスポットがあり、私は拡張された郵便番号も取得するのが好きです。 – Windle

3

は常に5桁(米国の場合はそれがないということです?)

re.match( '\ dの{5} $'、アドレス)

です

致します。

コメントは、検索対マッチについての権利であると私は、余分な4つの文字を含める場合:

re.search( '\ dの{5}( - \ D {4})$?'、アドレス)

する必要があります。

+0

私は郵便番号に4桁を追加することができます。この場合は、文字列の先頭から一致するため、正しい結果が得られません。 – sberry

1

あなたが使用することができます。

postal_code = re.match('^.*?(\d+)$', address) 
if postal_code!=None: 
    print postal_code.group(1) 
0

をこの1つは、すべてのこれらのフォーマットのために完璧に動作します:

99999から9999

address = '123 Main St, 12345-5678 USA' 
re.search('(\d{5})([- ])?(\d{4})?', address).groups() 

結果は:( '12345'、 ' - '、 '5678')

全体一致、使用取得する:

re.search('(\d{5})([- ])?(\d{4})?', address).group(0) 

とグループ(1)&群(3)の両方の部分を含有します郵便番号。私は郵便番号だけを含むフィールドにこれを適用しているので、代わりにマッチを使用します。私はまた、この場合の最初と最後に^ $を追加しました。

zip_code = '12345-6655' 
re.match('^(\d{5})([- ])?(\d{4})?$', zip_code).group(0) 
関連する問題