Python正则表达式每隔一个单词匹配一次

Python正则表达式每隔一个单词匹配一次,python,regex,Python,Regex,我一直在尝试并寻找一种解决方案,使用正则表达式匹配python中的其他所有单词。字符串以逗号分隔,长度未知 假设我有以下字符串: "keep, ignore, keep_this_too, ignore, keep_this_also, ignore" 我希望能够保留所有匹配的单词作为一个列表 我试着把我的正则表达式写成: ((?P<keep>.*),)* 为了打印出所有匹配的单词,我只得到最后一个单词以外的所有内容 谢谢 编辑: 我不能使用任何Python字符串操作。其目的是支

我一直在尝试并寻找一种解决方案,使用正则表达式匹配python中的其他所有单词。字符串以逗号分隔,长度未知

假设我有以下字符串:

"keep, ignore, keep_this_too, ignore, keep_this_also, ignore"
我希望能够保留所有匹配的单词作为一个列表

我试着把我的正则表达式写成:

((?P<keep>.*),)*
为了打印出所有匹配的单词,我只得到最后一个单词以外的所有内容

谢谢

编辑:

我不能使用任何Python字符串操作。其目的是支持研究人员提供的任何数据格式,为此,我们将每个格式的正则表达式存储在数据库中。 例如,它们可以提供一种数据格式,我们必须使用以下正则表达式:

"keep (ignore), keep (ignore), keep (ignore)"

*
贪婪地匹配(尽可能匹配所有内容)<代码>*,匹配所有内容,直到最后一个
。要进行非贪婪匹配,请使用
*?

re.match
只返回第一个匹配。(并且仅在输入字符串的开头匹配)。(见附件)

与修改后的正则表达式一起使用:

>>> 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.match
只返回第一个匹配。(并且仅在输入字符串的开头匹配)。(见附件)

与修改后的正则表达式一起使用:

>>> 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']
或:


正则表达式已经定义了单词中可以出现的字符,即
\w
表示这样的集合。 因此:

如果要忽略其他匹配,只需使用切片:

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
替换为
[^,]
,以匹配除逗号以外的所有字符。

正则表达式已经定义了单词中可以出现的字符,即
\w
表示这样的集合。 因此:

如果要忽略其他匹配,只需使用切片:

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
替换为
[^,]
,以匹配除逗号以外的所有内容。

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

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

['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']

您可以使用以下内容:

import re
re.findall("([^,]*), [^,]+[,]{0,1}", "keep, ignore, keep_this_too, ignore, keep_this_also, ignore")
但为什么不直接使用分割和切片结果:

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

您可以使用以下内容:

import re
re.findall("([^,]*), [^,]+[,]{0,1}", "keep, ignore, keep_this_too, ignore, keep_this_also, ignore")
但为什么不直接使用分割和切片结果:

"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 '
print(s.replace(' ','').split(',')[0::2])
收益率:

['keep', 'keep_this_too', 'keep_this_also']
这个

这个


你的话里面能有空格吗?也就是说,如果你有
“一,二,大数据,四,五”
?@RayToal,那么它就不是一个词了。谢谢,只是检查一下,因为你说术语是逗号分隔的。但你还能进一步澄清吗?所以你也允许空格来分隔单词?或者只是逗号还是空格?这是有区别的。为什么还要用正则表达式呢?如果索引%2==0I添加了为什么我不能在上面使用字符串操作您的单词中可以有空格吗?也就是说,如果你有
“一,二,大数据,四,五”
?@RayToal,那么它就不是一个词了。谢谢,只是检查一下,因为你说术语是逗号分隔的。但你还能进一步澄清吗?所以你也允许空格来分隔单词?或者只是逗号还是空格?这是有区别的。为什么还要用正则表达式呢?在逗号上拆分,去掉空格,并在索引%2==0I时使用它们。我添加了为什么我不能在上面使用字符串操作感谢响应,但我不想使用任何字符串操作(拼接)。@David,然后,使用最后一个代码,它只使用
re.findall
。顺便说一句,
[…:]
被称为slice。很抱歉,我没有看到第二部分,我会尝试一下。感谢您的回复,但我不想使用任何字符串操作(拼接)。@David,那么,使用最后一个只使用
re.findall
的代码。顺便说一句,
[..:]
被称为slice。很抱歉,我没有看到第二部分,我会去试试这个。