2017-03-06 10 views
1

を使用して、異なる文字列内の数字を比較します私はアドレスの2種類を持っているのPython

Unit 5, 123 Fake Street Drive 
123 Fake St Dr, Unit 5 

どのように私はPythonが数字で2つのアドレスを比較するために使用することができますか?例えば

Unit 5, 123 Fake Street Drive -> [5,123] 
123 Fake St Dr, Unit 5 -> [123,5] 

TRUE 

123 Fake Street Drive -> [123] 
123 Fake St Dr, Unit 5 -> [123,5] 

FALSE 

Unit 5, 155 Fake Street Drive -> [155,5] 
123 Fake St Dr, Unit 5 -> [123,5] 

FALSE 

私が今持っているすべては、次のとおりです。

if bool(set([int(s) for s in address.split() if s.isdigit()]) & set([int(s) for s in address2.split() if s.isdigit()])): 

私は数字の1つのリストは関係なく、オーダーの数の他のリストと同じであるかどうかを確認します。

+0

は、 '=='でセットを比較するだけで動作します。 –

+0

アドレスが「ユニット1,2ストリート」、「2完全に違うストリート1ユニット」の場合、出力は「False」にする必要があります。 –

+0

'' 1,2 ''を試してください.split() '' 1 ''を返します。 –

答えて

3

setを抽出し、==と比較するだけです。 setは、同等性を非常によくサポートします。

は、5,のようにうまく機能しません。だからisdigit()が失敗し、あなたのセットが等しくない。私が変更された場合、一方

import re 

address="Unit 5, 123 Fake Street Drive" 
address2 = "123 Fake St Dr, Unit 5" 

pattern = r"\b\d+\b" 
print(set(re.findall(pattern,address))==set(re.findall(pattern,address2))) 

これは、Trueをもたらし、私は言葉の内側の数字(例えばのようなN2P)を避けるために\d+\b\d+\bを使用して、数字を見つけるセットにそれらを置くと比較することre.findallを提案してみましょう

/上記のリストの1つから1つの番号を追加/削除します。False

コメントに示唆されているように、1つの文字列に数字が繰り返されていれば失敗します。は重複しています。

ことが、その後

collections.Counter(re.findall(pattern,address))==collections.Counter(re.findall(pattern,address2)) 

があまりにも動作することをsetcollections.Counterと修正を置き換え、問題だ場合、Counterは辞書であり、他の辞書と比較します。

+1

'{5} == {5,5}'; 'return's' True'(ここでは 'False'を返すべきです)、' Counter'またはマルチセットが必要です –

+0

あなたは正しいです! OPの例はそれをカバーしていません。いい視点ね。 「カウンター」で編集され、正しい位置に収まる。 –

+0

もう1つの質問ですが、単語の中にない数字を区別できますか?たとえば、「N2P」 –

0

ソートされたリストを使用することをお勧めします。セットではありません。セットは "ユニット1、1通りX"と "1通りY"を区別することはできませんが、ソートされたリストが行います。

+0

それはポイントです:順序を無視してください。 –

関連する問題