Python中的正则表达式-使用分组

6

我刚接触正则表达式,为什么这个代码无法输出“present”?

tale = "It was the best of times, ... far like the present ... of comparison only. "
a = re.compile('p(resent)')
print a.findall(tale)

>>>>['resent']

因为你的正则表达式搜索的组是'resent'。你能提供一个更好的输入/输出示例吗? - Ashwini Chaudhary
1
我期望它在一个只有一个元素的列表中输出字符串“present”(在字符串tale中,“present”仅出现一次)。我相信我正在搜索以“p”开头的“resent”的实例。 - Chet
这段程序的预期输出是什么:tale="resent present ppresent presentt" - Ashwini Chaudhary
@Chet,括号内的内容是组。 - JeffS
我期望从上述代码行得到的输出是:['resent','present']。 - Chet
@Chet,我也不理解这个输出。 - Lucas
2个回答

3

如果你想精确匹配单词present,可以尝试以下方法:

In [297]: tale="resent present ppresent presentt"

In [298]: re.findall(r"\bpresent\b",tale)
Out[298]: ['present']

1

来自Python文档

如果模式中存在一个或多个组,则返回一个组列表

如果您只想使用组进行分组,而不是捕获,请使用非捕获组:

a = re.compile('p(?:resent)')

对于这个正则表达式,没有实际意义,但是对于更复杂的正则表达式,例如:

a = re.compile('p(?:resent|eople)')

将匹配'present'或'people'。


1
好的,很棒。这解释了我想做的事情。你能向我解释一下我的先前代码在寻找什么(为什么p被忽略了)吗?非常感谢。 - Chet
1
它被用于匹配,但没有在返回信息中被捕获。例如,如果您想要找到一个百分比,但只关心数字部分--您将使用正则表达式(\d+)% - Barmar
那么一旦括号被包含,只有括号内的内容被捕获? - Chet
1
@Chet,当使用re.findall时,如果没有找到括号,则整个字符串将成为结果元素。当使用searchmatch时,您可以通过使用result.group(0)指定整个字符串或使用result.group(1)等访问组。 - Anorov
@Barmar 我对Python正则表达式不是很熟悉,但是OP可以在他/她的正则表达式中使用两个组吗?比如说 a = re.compile('(p(resent))') - Blue Magister
@BlueMagister 我自己对Python不是太熟悉,但这应该可以。我认为它会返回['present', 'resent'] - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接