2016-12-12 9 views
3

私のサンプルコンテンツがPython - 文字列からアドレスを取得する方法や、別の行にあるものの前に単語を取得する方法は?

content =""" 
Dear Customer, 

Detail of service affected: 

Bobs Builders 
Retail park 
The Aavenue 
London 
LDN 4DX 


Start Time & Date: 04/01/2017 00:05 
Completion Time & Date: 04/01/2017 06:00 

Details of Work: 
.... 

イムを下回っているが、すでに私もこの内容から都市を取得したいと思い

postcodes = re.findall(r"[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z]{2}", content) 

で郵便番号を引き出し、それさえも可能ですか?私は都市のリストを最初に提供しなければなりませんか?これを確認しますか?

郵便番号の前に行を追加する方法はありますか?アドレスは常にそのように送信されるからです。

私はポストコードの前に単語を取得するためにポストコード正規表現を使用できますか?

おかげ

+0

コンテンツを1行ずつ解析してみませんか? –

+0

どうすればいいですか?もし、ライン番号が毎回同じでないなら、どうすればいいでしょうか? – AlexW

+0

あなたのコンテンツの形式はまったく同じですか?この場合、8行目の単語を読んで都市を得ることができます。または、住所の前に「影響を受けるサービスの詳細:」という文が常にある場合は、次の行を入力することができます。 – Dadep

答えて

2

は、ここに例を示します

import re 
postcodes = re.findall(r"(\w+)\s+([A-Z]{3} \d[A-Z]{2})", content) 

print postcodes 
# => [('London', 'LDN 4DX')] 

あなたは2つのグループを取得し、最初のものは(おそらく別の回線で)右の郵便番号の前に言葉あり、もう一つは郵便番号そのものです。

例をより読みやすくするために、ポストコード正規表現が簡略化されています。

英国のコードに一致させる場合は、hereを参考にしてください。

あなたが言った正規表現が途中でLDN 4DXと一致しません。 [0-9R]ため?を追加するだろう:

postcodes = re.findall(r"[A-Z]{1,2}[0-9R]?[0-9A-Z]? [0-9][A-Z]{2}", content) 
2

は、この問題にアプローチする方法は複数あります:あなたはパターンマッチングを行うことにより、アドレス部分を抽出できた場合

1 - は、Google APIのジオロケーション

を使用して、あなたはGoogle Map Geocode APIにアドレスを渡し、あなたのためにアドレスを解析できるようにします。

2 - 正規表現検索

あなたはアドレスは常に、よくフォーマットされており、郵便番号は、常に都市名で先行していることを確認している場合、あなたはこのような状況に対処するために正規表現を使用することができます。

(\w*)\s+([A-Z]{3}\s+\d[A-Z]{2}) 

3 - 都市名のデータベースを使用する

住所が常に正しいとは限らない場合は、OpenAddressesなどの都市名のデータベースを使用するのが最善です。

4-これは、自然言語処理における情報抽出の古典的なアプリケーションである[BEST]

エンティティ抽出APIを使用してください。 nltkを使用して自分で実装することもできますし、AlchemyAPIなどのWebサービスを使用することもできます。あなたのテキストをコピーして貼り付けてdemoとし、あなた自身がどのように強力であるかを見てください。

関連する問題