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 回答
2

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

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

输出:

['keep', ' keep_this_too', ' keep_this_also']
于 2013-11-03T07:56:08.293 回答
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[^,]以匹配除逗号之外的所有内容。

于 2013-11-03T07:35:46.780 回答
0

你可以使用类似的东西:

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

但为什么不直接使用 split 并切片结果:

"keep, ignore, keep_this_too, ignore, keep_this_also, ignore".split(",")[0::2]
于 2013-11-03T07:57:07.240 回答
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 回答
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 回答