1

私は文字列を持っています:

This is @lame

ここでラメを抽出したい。しかし、ここに問題があります。上記の文字列は

This is lame

ここでは何も抽出しません。そして、この文字列は次のようになります。

This is @lame but that is @not

ここで私はラメを抽出し、そうではありません

したがって、それぞれの場合に期待する出力は次のとおりです。

 [lame]
 []
 [lame,not]

これらをPythonで堅牢な方法で抽出するにはどうすればよいですか?

4

3 に答える 3

3

re.findall()複数のパターンを見つけるために使用します。この場合@、単語の文字で構成される、が前に付いているものはすべて次のようになります。

re.findall(r'(?<=@)\w+', inputtext)

この(?<=..)構文は肯定的な後読みアサーションです。現在の位置の前に@文字がある場合にのみ一致します。したがって、上記のパターンは、それらの文字の前に記号がある場合にのみ、1 つ以上の単語文字 (\w文字クラス)に一致します。@

デモ:

>>> import re
>>> re.findall(r'(?<=@)\w+', 'This is @lame')
['lame']
>>> re.findall(r'(?<=@)\w+', 'This is lame')
[]
>>> re.findall(r'(?<=@)\w+', 'This is @lame but that is @not')
['lame', 'not']

パターンを再利用する予定がある場合は、最初に式をコンパイルしてから、コンパイルされた正規表現オブジェクトで.findall()メソッドを使用します。

at_words = re.compile(r'(?<=@)\w+')

at_words.findall(inputtext)

これにより、 を呼び出すたびにキャッシュ ルックアップを節約できます.findall()

于 2013-05-07T17:46:30.613 に答える
1

re lib を使用する必要があります。例を次に示します。

import re
test case = "This is @lame but that is @not"
regular = re.compile("@[\w]*")
lst= regular.findall(test case)
于 2013-05-07T17:48:02.720 に答える
1

これにより、要求した出力が得られます。

import re
regex = re.compile(r'(?<=@)\w+')
print regex.findall('This is @lame')
print regex.findall('This is lame')
print regex.findall('This is @lame but that is @not')
于 2013-05-07T17:46:57.803 に答える