0

正規表現分割を使用して段落を文に分割しようとしています。ここに投稿された2番目の回答を使用しようとしています: Pythonで段落から文を抽出するための正規表現

しかし、ピリオドがあっても文を終わらせたくない略語のリストがあります。しかし、それをその正規表現に適切に追加する方法がわかりません。Dr. St.(各行に1つずつ)のような用語を含むファイルから略語を読んでいます。

4

2 に答える 2

1

私はあなたの質問に直接答えませんが、この投稿にはあなたがあなたの問題のために働く正規表現を書くのに十分な情報が含まれているはずです。

ネガティブな後読みのリストを追加できます。後読みは幅がゼロであることに注意してください。つまり、必要な数の後ろを並べて配置しても、同じ位置から後読みを行うことができます。後読みで「多くの」数量詞(たとえば*、、)を使用する必要がない限り、すべてが正常である必要があります(?)。+{n,}

したがって、正規表現は次のように構成できます。

(?<!list )(?<!of )(?<!words )(?<!not )(?<!allowed )(?<!to )(?<!precede )pattern\w+

少し冗長すぎます。とにかく、私はこの投稿を、固定文字列のリストで後読みが可能であることを示すためだけに書いています。

実行例:

>>> s = 'something patterning of patterned crap patternon not patterner, not allowed patternes to patternsses, patternet'
>>> re.findall(r'(?<!list )(?<!of )(?<!words )(?<!not )(?<!allowed )(?<!to )(?<!precede )pattern\w+', s)
['patterning', 'patternon', 'patternet']

ただし、後読みを使用することには問題があります。ブラックリストに登録されたテキストとパターンに一致するテキストの間に動的な数のスペースがある場合、上記の正規表現は失敗します。後読みを維持しながら、上記のケースで機能するように正規表現を変更する方法が存在するかどうかは本当に疑問です。(連続するスペースはいつでも1に置き換えることができますが、より一般的なケースでは機能しません)。

于 2013-01-28T11:35:57.060 に答える
1

短い答え:すべての後読みアサーションが同じ固定幅でない限り、できません(おそらくあなたのケースではそうではありません;あなたの例には2文字の略語しか含まれていませんがMrs.、正規表現が壊れます)。

これは、現在の Python 正規表現エンジンの制限です。

より長い答え:

のような正規表現を記述して(?s)(?<!.Mr|Mrs|.Ms|.St)\.後読みアサーションの各交互部分を.必要な数の s でパディングして、それらすべてを同じ幅にすることができます。ただし、段落が で始まる場合など、一部の状況では失敗しMr.ます。

とにかく、ここでは適切なツールを使用していません。Natural Language Toolkitなど、仕事用に設計されたツールを使用することをお勧めします。

正規表現に行き詰まっている場合 (残念です!)、代わりに次のfindall()アプローチを試して使用できます。split()

(?:(?:\b(?:Mr|Ms|Dr|Mrs|St)\.)|[^.])+\.\s*

.は、 (オプションで空白が続く)で終わる文に一致し、許可された略語のいずれかが前にない限り、ドットを含まない可能性があります。

>>> import re
>>> s = "My name is Mr. T. I pity the fool who's not on the A-Team."
>>> re.findall(r"(?:(?:\b(?:Mr|Ms|Dr|Mrs|St)\.)|[^.])+\.\s*", s)
['My name is Mr. T. ', "I pity the fool who's not on the A-Team."]
于 2013-01-28T09:00:16.530 に答える