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

时间:2017-07-14 18:49:46

标签: 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'cat',)
(u'cat',)

我想:

cats
catnip

2 个答案:

答案 0 :(得分:0)

我认为您只想在cat之后匹配任何非空白字符,re.search(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())

请参阅http://php.net/manual/en/function.end.php

模式匹配:

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

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

答案 1 :(得分:0)

听起来你想匹配任何以' cat':

开头的单词
./test WTF?

返回:

$state.current.name

您也可以使用:

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"因为它是括号中唯一的子串,所以你只打印" cat"使用print re.search("cat\S*",s).group() 打印匹配中的群组时第二个是"(cat).*[^\s]+"跟随.groups(),匹配任何字符零次或多次,包括空格,因此正则表达式匹配整个字符串,然后才到达"而不是空格" char match,.*

另一个问题是你正在使用(cat)返回一个包含匹配中所有组的元组。在您的情况下,您只有一个组,因此它返回一个只有一个组的元组。例如:

[^\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()

(u'cats',)
(u'catnip',)

让它只返回匹配的组:

.group()

此外,由于该组是整场比赛,因此您不需要对其进行分组(即,您不需要括号)。 print re.search("(cat\w*)",s).group() 默认为cats catnip ,返回整个匹配:

.group()

打印您想要的内容。

最后,请注意.group(0)print re.search("cat\w*",s).group() *之后使用\w,以便它也匹配单词[^\s]