[英]Python Regex match every other word
我一直在尝试寻找一种使用正则表达式匹配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)"
.*
贪婪地匹配(如果可能,则匹配所有内容); .*,
匹配任何东西,直到最后,
。 要非贪婪地匹配,请使用.*?
。
并且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']
您仍然可以将.split()
存储在数据库中吗?
String="keep, ignore, keep_this_too, ignore, keep_this_also, ignore"
String.split(",")[0::2]
输出:
['keep', ' keep_this_too', ' keep_this_also']
正则表达式已经定义了单词中可以出现的字符,即\\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
以匹配除逗号以外的所有内容。
您可以使用类似:
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]
你需要这个:
s = ' keep, ignore, keep_this_too , ignore, keep_this_also, ignore '
print(s.replace(' ','').split(',')[0::2])
产量:
['keep', 'keep_this_too', 'keep_this_also']
这个?
>>> 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']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.