1

テキストジャーナルを解析しようとしていますが、テキストの特定のセクションにのみ関心があります。うっかりセクションを特定していることに気付くまで、うまくやっていると思っていました。

次のセクションを一致させたいとします。

セクション 7 - 最終診断の提供

としても表示される場合があります

セクション 7. 最終診断の提供

しかし、次のように文字列の前に see または under という単語がある場合は、何も一致させたくありません。

セクション 7 を参照してください。最終診断の提供

また

セクション 7 に基づいて提出されます。 終末期診断の提供

何にも一致してはいけません。

否定的な先読みを使用してみましたが、単語が除外されるだけで、一致全体が破棄されるわけではありません。

((?!see )Section[\s\\n]+7[\s+]+?[-:\\n\.]+?[\s+]+?(Delivering|Deliver)(.*terminal[\s+]+Diagnosis('s)?)?[\.]?)

ルックアラウンドの概念をきちんと把握しているとは思えません。ヘルプ?

4

2 に答える 2

3

否定先読みは、主な式のに一致できないグループを指定します。しかし、あなたはその前に何も持っていません。

否定後読みを使用します。

(?<!see|under)

の代わりに(?!see )

その他のコメント: 大文字と小文字のエラーがあり (ターミナルは Terminal である必要があります)、文字列全体を r のように前に付けて "生" にする場合、 のようなr'my string'ダブルエスケープ文字は必要ありません\n

于 2013-11-06T04:49:32.953 に答える
2

次のことを試してください..

マッチングに使用しているケースが何であれr、正規表現の前に使用します。rは、正規表現パターンの Python の生の文字列表記であり、エスケープを回避し、大文字または小文字を探すという事実を回避するために、大文字と小文字をre.I区別しないマッチングに使用します。

これは、二重の負の後読みを使用した可能な解決策です。

(?<!see)(?<!under)\s+(section 7[\s.:-]+(?:deliver(?:ing)?).*?terminal\s+diagnosis(?:'s)?)

見るlive demo


生の文字列表記と を使用する例ではre.I、これが私が意図したことです。

matches = re.findall(r"(?<!see)(?<!under)\s+(section 7[\s.:-]+(?:deliver(?:ing)?).*?terminal\s+diagnosis(?:'s)?)", s, re.I)
print matches
于 2013-11-06T06:43:01.540 に答える