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())
见
模式匹配:
-acat
子字符串cat
-0个或更多非空白字符(如果您只需要匹配字母,请替换为\S*
模式)[^\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())
见
模式匹配:
-acat
子字符串cat
-0个或更多非空白字符(如果您只需要匹配字母,请替换为\S*
模式)[^\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
匹配