0

Pythonの正規表現パターンを探しています。それは存在しなければならないようですが、私は困惑しています。

住所を検索する必要があり、検索する文字列は次の形式にすることができます

address_is_after_123
 - or -
123_address_is_before

3つ以上の順列が存在する可能性があることに注意してください。ただし、2つの順列のソリューションをさらに拡張できることを期待しています。

単純に複数の正規表現を作成することもできますが、理想的には単一の正規表現が必要です。私が持っている最高のものは:

m = re.match("(?:address_is_after_(\d+)|(\d+)_address_is_before)",text)

これは機能しますが、m.group(1)またはm.group(2)に値があるかどうかをテストする必要があります。正規表現を記述して、一致する場合に追加の処理なしでアドレスを取得できるようにする方法はありますか?

4

2 に答える 2

3

"address_is_after_"後読み( )の長さが一定であれば、ルックアラウンドでそれを行うことができます。

>>> m = re.search(r"(?<=address_is_after_)\d+|\d+(?=_address_is_before)",text)
>>> m.group(0)
'123'
于 2012-09-02T15:07:54.277 に答える
0

どのグループが一致するかをテストする必要はありません。一致しないグループは、を返しますNone。これは、次のようにfalseとして扱われますor

>>> for text in ["address_is_after_123", "123_address_is_before"]:
...             m = re.match("(?:address_is_after_(\d+)|(\d+)_address_is_before)",text)
...             print(m.group(1) or m.group(2))
...
123
123
于 2012-09-03T01:07:25.503 に答える