2

テキストの各行に良い言葉と悪い(不要な)言葉が含まれているテキストがあります。したがって、パターンは次のようになります

good1-good2 good3 bad1-good4-bad2 some more good words
good1-good2 good3 bad1 bad2 
good1-good2 good3 bad1 bad2 bad3

ここで、最初の悪い単語を含め、次の行のすべてを拒否する必要があります。

good1-good2 good3 bad1-good4-bad2 some more good wordsなるべきgood1-good2 good3

good1-good2 good3 bad1 bad2なるべきgood1-good2 good3

good1-good2 good3 bad1 bad2 bad3なるべきgood1-good2 good3

私はpythonを使用しているので、これが私がしたことです

p=re.compile('([\w \d-]+) (bad1|bad2|bad3).+',re.I)
m=p.search('good1-good2 good3 bad1-good4-bad2 ')
m.group(1)

そして、これgood1-good2 good3 は私が欲しいものですが、

m=p.search('good1-good2 good3 bad1 bad2 ')
m.group(1)

戻り値は貪欲good1-good2 good3 bad1 であるため、行末まで文字の一致が続き、バックトラックして最後の悪い単語を見つけると思いましたが、これを行うと++([\w \d-]+)bad2

p=re.compile('([\w \d-]+) (bad1|bad2|bad3).+',re.I)
m=p.search('good1-good2 good3 bad1 bad2 bad3')
m.group(1)

再び戻りますgood1-good2 good3 bad1。それを説明していただけますか?greediness正規表現での私の理解に問題があるかもしれないので? このような正規表現を使用してこの問題を解決することを理解しましたが、使用すると常に最初の悪い単語(この場合はbad1)が返される([\w \d-]+?) (bad1|bad2|bad3).+理由がわかりませんか?([\w \d-]+) (bad1|bad2|bad3).+

時間をありがとう。

編集:good1-good2 good3--only good wordsしかし、正規表現はどうあるべきかの ように、良い言葉だけで悪い言葉がないパターンがあるとし ますか? この正規表現を試しまし([\w \d-]+?) ?(bad1|bad2|bad3)?.*たが、これはパターンの最初の文字を返します。

4

1 に答える 1

3

この場合について:

m=p.search('good1-good2 good3 bad1 bad2 ')

あなたは正しいです。 ([\w \d-]+)貪欲なので、可能な限り「食べ」、後戻りします。

ただし、この場合について:

m=p.search('good1-good2 good3 bad1 bad2 bad3')

おそらく表示されていないのは、不適切な単語の後に少なくとも1つの文字.+が一致している必要があるということです。そのため、正規表現は悪い単語として一致することができません。一致した場合、は何にでも一致する文字が不足します。したがって、それは再びに戻ります。に変更して、違いを確認してください。最初のケースでたまたま余分なスペースがあったからです。つまり、そこで物事が「期待どおりに機能した」からです。bad3.+bad2.+.* bad2

言い換えれば、いくつかの不幸な偶然の一致があなたを混乱させました。しかし、貪欲についてのあなたの理解は健全です。

編集

以下のコメントから@loveshによって書かれた、質問の編集された部分について:

([\w \d-]+?) ?(bad1|bad2|bad3|$)
于 2012-06-20T15:30:57.767 に答える