0

これは簡単な質問です:

複数の一致文字列で複数回使用できる正規表現を指定するにはどうすればよいですか? 私はそのように正しく表現していないかもしれませんが、いくつかのコードを示してみます。

私はこの正規表現を持っています:

regex = compile(r'(?=(%s))')

for ループでは、必要な文字列を正規表現に指定した文字列と一致させようとします。これにより、反復ごとに、一致する文字列を変更し、一致させようとします。

これは可能ですか、次のようなことができますか

regex.findall(myStringString, myMatchString)

または、新しい文字列と一致するように正規表現を再コンパイルする必要がありますか?

より明確にする:私はこれをしたい:

re.findall('(?=(%s))' %myMatchString, mySearchString)

しかし、ループの反復ごとに myMatchString が変更されるため、次のようにして、新しい文字列を一致させることができます。

regex = re.compile(r'(?=(%s))')
regex.findall( myMatchString, mySearchString)

読んでくれてありがとう

4

2 に答える 2

1

ポイントはre.compile、同じパターンを何度も再利用することを明示的に宣言することです。そして、必要なコンパイルを避けることができれば幸いです。

あなたがやっていることは必ずしも同じパターンを再利用しているわけではないので、システムにパターンをキャッシュさせて(re多くキャッシュnしますが、正確な数を覚えることはできません)、re.findall(...)/whatever 正規表現を新たに使用する方がよいでしょう。毎回。

于 2013-06-25T21:57:43.833 に答える
1

さて、あなたの言うことが理解できれば、あなたが書きたいのは次のことだけです:

def match_on_list_of_strings(list_of_strings):
    regex = compile(r'(?=(%s))')
    for string in list_of_strings:
        yield regex.findall(string)

これにより、文字列のリストに文字列が存在する回数だけ文字列に一致が適用されますが、正規表現は一度だけコンパイルされます。

ああ...しかし、そのための正規表現は必要ありません:

def match_on_list_of_strings(bigstring, list_of_strings):
    for string in list_of_strings:
        if string in bigstring:
            yield string

または、本当に re を使用したい場合:

def match_on_list_of_strings(bigstring, list_of_strings):
    for string in list_of_strings:
        if re.match('.*'+string+'.*', bigstring):
            yield string

そして、あなたの質問に答えるために、宛先文字列を正規表現にコンパイルすることはできませんが、その逆だけです。正規表現をコンパイルすると、実際の正規表現がオートマトンの内部表現に変換されます。NFA正規表現に関するコースを読みたいと思うかもしれません

于 2013-06-25T22:00:12.483 に答える