テキストの各行に良い言葉と悪い(不要な)言葉が含まれているテキストがあります。したがって、パターンは次のようになります
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)?.*
たが、これはパターンの最初の文字を返します。