キーがすべてプリコンパイルされた正規表現である辞書があります。文字列をこれらの正規表現のいずれかに一致させたい。
調べてみると、joinメソッドで正規表現を結合することで複数の正規表現を一致させることができることがわかりました。しかし、そうすると、タイプエラーが発生します。
import re
regex1 = re.compile("regex1.*")
regex2 = re.compile("regex2\d")
re_dict = {regex1 : "stuff", regex2 : "otherstuff"}
match_multiple = "|".join(list(re_dict.keys()))
string = 'regex25'
if re.match(match_multiple, string):
print("matched")
これは与える:
Traceback (most recent call last):
File "./a.py", line 7, in <module>
match_multiple = "|".join(list(re_dict.keys()))
TypeError: sequence item 0: expected str instance, re.Pattern found
str.join
オブジェクトではなく、文字列で機能しre
ます。参加してからコンパイルします。
regex1 = "regex1.*"
regex2 = "regex2\d"
re_dict = {regex1 : "stuff", regex2 : "otherstuff"}
match_multiple = re.compile("|".join(re_dict))
dictは順序付けられていないことに注意してください(python 3.6を実行している場合を除く)。したがって、式の順序が重要な場合は、コードが正しくない可能性があります。
また、辞書を反復処理するとキーが生成されるlist(re_dict.keys())
ためre_dict
、からへの簡略化にも注意してください。明示的に呼び出しkeys
たり変換したりする必要はありませんlist
。
(まあ、ここで辞書を使用することはとにかく実際には役に立ちません。将来、正規表現をキーとして使用する方法は?)
プリコンパイルされた式にしかアクセスできない場合は、正規表現を「エミュレート」するか、any
if any(r.match(string) for r in re_dict):
any
短絡するためTrue
、1つの正規表現が一致するとすぐに終了します。
または、pattern
regex属性を使用してパターンを再構築します。
match_multiple = re.compile("|".join([r.pattern for r in re_dict]))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加