Python正则表达式匹配字符串中的项,如果子项存在,则返回项

Python正则表达式匹配字符串中的项,如果子项存在,则返回项,python,regex,Python,Regex,我有一个字符串列表,我想提取字符串中与子字符串匹配的标记,方法是部分匹配该子字符串,直到出现空白 l=[u'i like cats and dogs',u'i like catnip plant', u'i like cars'] for s in l: if "cat" in s: #match cat until whitespace print re.search("(cat).*[^\s]+",s).groups() 但是,这只返回cat: (u

我有一个字符串列表,我想提取字符串中与子字符串匹配的标记,方法是部分匹配该子字符串,直到出现空白

l=[u'i like cats and dogs',u'i like catnip plant', u'i like cars']
for s in l:
    if "cat" in s:
        #match cat until whitespace
        print re.search("(cat).*[^\s]+",s).groups()
但是,这只返回cat:

(u'cat',)
(u'cat',)
我想:

cats
catnip

我认为您只需要匹配
cat
re之后的任何非空白字符。搜索(r“cat\S*”,S)
就足够了

import re
l=[u'i like cats and dogs',u'i like catnip plant', u'i like cars']
for s in l:
    #match cat until whitespace
    m = re.search(r"cat\S*",s)
    if m:
        print(m.group())

模式匹配:

  • cat
    -a
    cat
    子字符串
  • \S*
    -0个或更多非空白字符(如果您只需要匹配字母,请替换为
    [^\W\d]*
    模式)

要使模式不区分大小写,请将
re.I
标志传递给
re.search
方法,或在模式开头添加
(?I)
内联修饰符版本。

我想您只需要匹配
cat
re.search(r“cat\S*”
就足够了

import re
l=[u'i like cats and dogs',u'i like catnip plant', u'i like cars']
for s in l:
    #match cat until whitespace
    m = re.search(r"cat\S*",s)
    if m:
        print(m.group())

模式匹配:

  • cat
    -a
    cat
    子字符串
  • \S*
    -0个或更多非空白字符(如果您只需要匹配字母,请替换为
    [^\W\d]*
    模式)

要使模式不区分大小写,请将
re.I
标志传递给
re.search
方法,或在模式开头添加
(?I)
内联修饰符版本。

听起来像是要匹配以“cat”开头的任何单词:

import re
l=[u'i like cats and dogs',u'i like catnip plant', u'i like cars']
for s in l:
    if "cat" in s:
        print re.search("cat\w*",s).group()
这将返回:

cats
catnip
您还可以使用:

print re.search("cat[^\s]*",s).group()

详情:

您的正则表达式有以下问题:
“(cat)。*[^\s]+”
。首先,您只对“cat”进行分组,因为它是括号中唯一的子字符串,所以在使用
.groups()
打印匹配中的组时,您只打印“cat”。第二个是
*
,它跟在
(cat)
后面,匹配任何字符零次或多次,包括一个空格,因此正则表达式在匹配“nota space”字符之前匹配整个字符串,
[^\s]

另一个问题是,您使用的是
.groups()
,它返回匹配中所有组的元组。在您的例子中,您只有一个组,因此它返回一个只有一个组的元组。例如:

l=[u'i like cats and dogs',u'i like catnip plant', u'i like cars']
for s in l:
    if "cat" in s:
        print re.search("(cat\w*)",s).groups()
返回这些元组(每个元组只有一个组):

因为只有一个组,所以不需要元组,所以可以使用
.group()

要仅返回匹配的组,请执行以下操作:

cats
catnip
此外,由于组是整个匹配项,因此不需要对其进行分组(即,不需要括号)
.group()
默认为
.group(0)
,它返回整个匹配项:

print re.search("cat\w*",s).group()
打印你想要的


最后,请注意,
*
\w
[^\s]
\s
之后使用,以便它也与单词
cat
匹配。

听起来像是要匹配任何以“cat”开头的单词:

import re
l=[u'i like cats and dogs',u'i like catnip plant', u'i like cars']
for s in l:
    if "cat" in s:
        print re.search("cat\w*",s).group()
这将返回:

cats
catnip
您还可以使用:

print re.search("cat[^\s]*",s).group()

详情:

您的正则表达式有以下问题:
“(cat)。*[^\s]+”
。首先,您只对“cat”进行分组,因为它是括号中唯一的子字符串,所以在使用
.groups()
打印匹配中的组时,您只打印“cat”。第二个是
*
,它跟在
(cat)
后面,匹配任何字符零次或多次,包括一个空格,因此正则表达式在匹配“nota space”字符之前匹配整个字符串,
[^\s]

另一个问题是,您使用的是
.groups()
,它返回匹配中所有组的元组。在您的例子中,您只有一个组,因此它返回一个只有一个组的元组。例如:

l=[u'i like cats and dogs',u'i like catnip plant', u'i like cars']
for s in l:
    if "cat" in s:
        print re.search("(cat\w*)",s).groups()
返回这些元组(每个元组只有一个组):

因为只有一个组,所以不需要元组,所以可以使用
.group()

要仅返回匹配的组,请执行以下操作:

cats
catnip
此外,由于组是整个匹配项,因此不需要对其进行分组(即,不需要括号)
.group()
默认为
.group(0)
,它返回整个匹配项:

print re.search("cat\w*",s).group()
打印你想要的

最后,请注意,
*
\w
[^\s]
\s
之后使用,以便它也与单词
cat
匹配