正则表达式总是贪婪的,即使我给它非捕获括号?

2024-10-01 11:19:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的弦:

strings = [
'title : Booking things author J smith',
'title : Unbe God author:  K. sweet'
]

字符串在“title”和“title”之间以及“author”和author之间可能有冒号,也可能没有。但它们总是有“标题”和“作者”两个词。在

我想像这样捕获标题:Booking things,和{}。在

我有两个正则表达式:

^{pr2}$

结果是:
规则1:

import re
re.findall(regex1, string, flags=re.I)
['title : Booking things ']

规则2:

import re
re.findall(regex2, string, flags=re.I)
[' : Booking things ']

为了不捕获这个词,{cd5}我想不去捕捉这个词。如何告诉它在不使用lookbehind时不捕获单词title?在

在第二个例子中,regex2,我确实使用了一个look-behind,但是随后我遇到了一个类似的问题。我如何告诉它不要捕获:,但仍然要在后面寻找单词title?我也避免了这样一个事实:向后看必须是固定宽度的。在


Tags: importre标题stringtitle规则单词author
1条回答
网友
1楼 · 发布于 2024-10-01 11:19:49

I thought that the non-capturing (?:) would tell it not to capture the word title

非捕获组仍然使用文本。它们只是匹配(文本被抓取并添加到匹配结果中),而不是捕获(=将匹配值的一部分存储在特定编号或命名的缓冲区中)。若要检查是否存在/不存在,仅存在查找区域(或定位点)。在

很明显,您希望从匹配项中丢弃前缀title :。不能使用lookbehind,因为在Python re模块中不允许使用可变宽度的lookbehind(其中包含限定符的模块)。一个常见的解决方法是围绕需要获得的模式使用捕获组。在

您可以围绕[\w\s]+子模式设置一个捕获组,以将该值捕获到组1中:

import re
strings = [
'title : Booking things author J smith',
'title : Unbe God author:  K. sweet'
]
for x in strings:
    m = re.search(r"(?:title\s*:?\s*)([\w\s]+)(?=author)", x)
    if m:
        print(m.group(1))

sample demo的输出:

^{pr2}$

请注意,如果您想去掉捕获文本中的尾随空格,请使用稍微调整的regex:

(?:title\s*:?\s*)([\w\s]+?)\s+(?=author)
                         ^

regex demo?使[\w\s]+子模式变得懒惰,并将在一个或多个空白(\s+)之前匹配尽可能少的字符,这些空格(\s+)正好位于一个文本字符序列author之前。在

相关问题 更多 >