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