0

私は、正規表現を使用してPythonの他のすべての単語と一致する解決策を探していました。文字列は不明な長さでカンマで区切られています。

次の文字列があるとします。

"keep, ignore, keep_this_too, ignore, keep_this_also, ignore"

一致するすべての単語をリストとして保持できるようにしたいと思います。

私は正規表現を次のように書いてみました:

((?P<keep>.*),)*

次に使用

result = re.match(regex, string)
print result.group(keep)

一致するすべての単語を印刷しようとすると、最後の単語以外はすべて取得されます。

ありがとう

編集:

Python 文字列操作を使用できません。これの目的は、研究者が提供するあらゆるデータ形式をサポートすることです。これを行うために、各形式のデータベースに正規表現を保存しています。たとえば、次の正規表現を使用する必要があるデータ形式を提供できます。

"keep (ignore), keep (ignore), keep (ignore)"
4

6 に答える 6

2

.*貪欲に一致します (可能であればすべてに一致します)。.*,最後の まですべて一致します,。非貪欲に一致させるには、 を使用します.*?

そしてre.match、最初の一致のみを返します。(そして、入力文字列の先頭でのみ一致します)。( search() と match()を参照)

re.findall変更された正規表現で使用する:

>>> s = "keep, ignore, keep_this_too, ignore, keep_this_also, ignore"
>>> re.findall(r'([^,\s]+)', s)
['keep', 'ignore', 'keep_this_too', 'ignore', 'keep_this_also', 'ignore']
>>> re.findall(r'([^,\s]+)', s)[::2] # using slice to get every other matches.
['keep', 'keep_this_too', 'keep_this_also']

また:

>>> re.findall(r'([^,\s]+)(?:,\s*[^,\s]+)?', s)
['keep', 'keep_this_too', 'keep_this_also']
于 2013-11-03T07:29:05.080 に答える
0

正規表現は、単語に表示できる文字を既に定義しています。つまり、\wそのようなセットを示します。したがって:

In [1]: import re
   ...: re.findall('\w+', "keep, ignore, keep_this_too, ignore, keep_this_also, ignore")
   ...: 
Out[1]: ['keep', 'ignore', 'keep_this_too', 'ignore', 'keep_this_also', 'ignore']

他のすべての一致を無視する場合は、単純にスライスを使用します。

In [2]: ['keep', 'ignore', 'keep_this_too', 'ignore', 'keep_this_also', 'ignore'][::2]
Out[2]: ['keep', 'keep_this_too', 'keep_this_also']

(または他の部分文字列)で始まる文字列のみを保持したい場合は、単純に の代わりにkeepパターンを使用します。keep\w*\w+

In [4]: re.findall('keep\w*', "keep, ignore, keep_this_too, ignore, keep_this_also, ignore")
Out[4]: ['keep', 'keep_this_too', 'keep_this_also']

一致させようとしているものが実際には単語ではない場合、つまり、スペースや句読点などの文字が含まれる可能性がある場合は、上記の正規表現\wで with[^,]を置き換えて、コンマ以外のすべてに一致させることができます。

于 2013-11-03T07:35:46.780 に答える
0

これ?

>>> s = "keep, ignore, keep_this_too, ignore, keep_this_also, ignore"
>>> import re
>>> re.findall(r'(\w+)\W+\w+', s)
['keep', 'keep_this_too', 'keep_this_also']
于 2013-11-03T11:00:44.063 に答える
0

あなたはこれを必要とします:

s = ' keep, ignore,  keep_this_too  , ignore, keep_this_also, ignore '
print(s.replace(' ','').split(',')[0::2])

収量:

['keep', 'keep_this_too', 'keep_this_also']
于 2013-11-03T10:13:59.827 に答える