0

文字列を正規表現と一致させるのに問題があります (私は正規表現の経験がありません)。各単語とタグの後にスラッシュを含む文字列があります。例:

led/O by/O Timothy/PERSON R./PERSON Geithner/PERSON ,/O the/O president/O of/O the/O New/ORGANIZATION

これらの文字列では、 の前にあるすべての文字列にのみ関心があります/PERSON。私が思いついた正規表現パターンは次のとおりです。

(\w)*\/PERSON

そして私のコード:

match = re.findall(r'(\w)*\/PERSON', string)

基本的に、前に来る単語に一致します/PERSON。出力:

>>> reg
['Timothy', '', 'Geithner']

私の問題は、 のように空の文字列に一致する 2 番目の一致、R./PERSONドットが単語文字ではないことです。正規表現を次のように変更しました。

match = re.findall(r'(\w|.*?)\/PERSON', string)

しかし、今の試合は次のとおりです。

['led/O by/O Timothy', ' R.', ' Geithner']

led/O by/O一致するだけでなく、最初の /PERSON の前にあるすべてのものを含んでいますTimothy。略語としてピリオドを含めながら、誰かがこのマッチングを行う方法について私を助けてくれませんか? または、少なくとも、空の文字列が一致していませんか?

ありがとう、

4

2 に答える 2

1

まず、(\w|.)「単語の文字または任意の文字」に一致します (ドットは任意の文字に一致するため、これらのスペースが取得されます)。

これをバックスラッシュでエスケープするとうまくいきます:(\w|\.)

第二に、@ Ionut Hulubが指摘しているように、何かに一致することを確認する+代わりに使用したい場合がありますが、正規表現は「左端、最長」の原則に基づいて機能するため、常にスラッシュの前の最も長い部分と一致しようとします.*

空白以外の文字に一致させたい場合は、代わりに を使用できますこれ\S(\w|\.)、実際に必要な場合があります。

于 2013-03-31T03:28:21.333 に答える
1

スペース文字 ( ) 以外のすべてに一致します[^ ]**キャプチャ内に星 ( ) も必要です。

match = re.findall(r'([^ ]*)\/PERSON', string)
于 2013-03-31T03:17:53.783 に答える