繁体   English   中英

Python Regex每隔一个单词都匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM