我有一个字符串列表,我想在字符串中提取与子字符串匹配的标记,通过部分匹配该子字符串直到空格。
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
答案 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]
。