Python正则表达式匹配所有其他单词

时间:2013-11-03 07:25:54

标签: python regex

我一直在尝试使用正则表达式搜索与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)"

6 个答案:

答案 0 :(得分:2)

.*贪婪地匹配(如果可能,匹配所有内容); .*,匹配所有内容,直到最后,。要非贪婪地匹配,请使用.*?

re.match仅返回第一场比赛。 (并且只在输入字符串的开头匹配)。 (见search() vs 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']

答案 1 :(得分:1)

您仍然可以将.split()存储在数据库中吗?

String="keep, ignore, keep_this_too, ignore, keep_this_also, ignore"
String.split(",")[0::2]

输出:

['keep', ' keep_this_too', ' keep_this_also']

答案 2 :(得分: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替换为[^,]以匹配除了逗号之外的一切。

答案 3 :(得分:0)

您可以使用以下内容:

import re
re.findall("([^,]*), [^,]+[,]{0,1}", "keep, ignore, keep_this_too, ignore, keep_this_also, ignore")

但为什么不使用split和slice结果:

"keep, ignore, keep_this_too, ignore, keep_this_also, ignore".split(",")[0::2]

答案 4 :(得分: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']

答案 5 :(得分: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']