0

word1 の後に word2 が続き、その後に word3 が続き、間に任意の数の文字があるパターンがあります。ただし、私のファイルには多くのランダムな改行文字とその他の空白文字が含まれています。つまり、単語 1 と 2 または単語 2 と 3 の間に、0 個以上の単語および/または 0 個以上の改行がランダムに存在する可能性があります。

このコードが機能しないのはなぜですか? (何にもマッチしません)

strings = re.findall('word1[.\s]*word2[.\s]*word3', f.read())

[.\s]* - これが意味すること - 「.」(任意の文字) または「\s」(改行文字) を複数回検索する(*)

4

2 に答える 2

1

正規表現が機能しない理由は、正規表現が単一の行でのみ一致しようとするためです。改行文字 ( \n) を見つけると停止し、パターンの先頭から開始して改行のパターンと一致させようとします。

正規表現が改行文字を無視するようにするには、関数re.DOTALLに 3 番目のパラメーターとして追加する必要があります。findall

strings = re.findall('word1.*?word2.*?word3', f.read(), re.DOTALL)
于 2013-04-02T00:06:15.753 に答える
0

2 つの問題があります。

1).括弧内に特別な意味はありません[]

次のように、代わり[]に使用するように変更します。()(.|\s)

2)\通常の文字列内での動作とは異なります。

生の文字列を使用してみてください:

re.findall(r'word1 ..blah..')

r文字列のプレフィックスに注意してください。

それらをまとめる:

strings = re.findall(r'word1(.|\s)*word2(.|\s)*word3', f.read())

ただし、これにより返されるリストが変更されることに注意してください。

于 2013-04-02T00:03:04.923 に答える