動機
私は住所を解析しており、住所と国を別々の一致で取得する必要がありますが、国にはエイリアスがある可能性があります。
UK == United Kingdom,
US == USA == United States,
Korea == South Korea,
等々...
説明
したがって、私が行うことは、次のように、OR 演算子で区切られたすべての可能な国名 (少なくとも表示される可能性が高いもの) を持つ大きな正規表現を作成することです。
germany|us|france|chile
しかし問題は、次のような複数の単語の国名とその短いバージョンにあります。
Republic of Moldova
とMoldova
これを例として使用すると、次の文字列が得られます。
'Somewhere in Moldova, bla bla, 12313, Republic of Moldova'
これから得たいもの:
'Somewhere in Moldova, bla bla, more bla, 12313'
'Republic of Moldova'
しかし、これは私が得るものです:
'Somewhere in Moldova, bla bla, 12313, Republic of'
'Moldova'
正規表現
いくつかのケースがあるので、私がこれまでに使用しているものは次のとおりです。
^(.*),? \(?(republic of moldova|moldova)\)?(.*[\d\-]+.*|,.*[:/].*)?$
国名の後にファックス、電話番号、郵便番号などがあるかもしれないので (私は気にしません)、最後に一致したグループを使用してそれらを削除します。
(.*[\d\-]+.*|,.*[:/].*)?
また、国名が括弧で囲まれている場合があるため、2 番目の一致グループ\(?
の\)?
前後に、すべての国が含まれています。
(republic of moldova|moldova|...)
質問
問題は、大きいエントリのサブセットであるエントリがある場合、長いエントリよりも短いエントリが選択され、残りは base_address 文字列にとどまることです。2 つの値が一致する場合に、可能な最大の一致を選択するように正規表現に指示する方法はありますか?
編集
- 組み込みのreモジュールでPythonを使用しています
m.buettner が示唆するように、最初に一致するグループを から
(.*)
に変更(.*?)
すると、現在の問題は実際に修正されますが、別の問題も作成されます。他の例を考えてみましょう:'Department of Chemistry, National University of Singapore, 4512436 Singapore'
一致:
'Department of Chemistry, National University of'
'Singapore'
ここでは、一致するのが早すぎます。