gpt4 book ai didi

Python 正则表达式为最后一个匹配的字符返回额外的捕获组

转载 作者:行者123 更新时间:2023-11-28 16:29:02 26 4
gpt4 key购买 nike

我正在尝试创建一个正则表达式,它将接受字符串并将它们分成三组:(1) 字符串开头的特定单词列表中的任何一个。 (2) 字符串末尾的特定单词列表中的任何一个。 (3) 这两个匹配项之间的所有字母/空格。

作为示例,我将使用以下两个字符串:

'There was a cat in the house yesterday'
'Did you see a cat in the house today'

我希望将字符串分解为捕获组,以便匹配对象 m.groups() 将分别为每个字符串返回以下内容:

('There', ' was a cat in the house ', 'yesterday')
('Did', ' you see a cat in the house ', 'today')

最初,我想出了以下正则表达式:

r = re.compile('^(There|Did) ( |[A-Za-z])+ (today|yesterday)$')

但是这会返回:

('There', 'e', 'yesterday')
('Did', 'e', 'today')

所以它只给我在中间组中匹配的最后一个字符。我了解到这不起作用,因为捕获组只会返回匹配的最后一次迭代。所以我在中间的捕获组周围加上了括号,如下所示:

r = re.compile('^(There|Did) (( |[A-Za-z])+) (today|yesterday)$')

但是现在,虽然它至少捕获了中间组,但它还在 m.groups() 中返回了一个额外的“e”字符,即:

('There', 'was a cat in the house', 'e', 'yesterday')

...虽然我觉得这与回溯有关,但我不明白为什么会这样。有人可以向我解释为什么会得到这个结果,以及我如何才能得到想要的结果吗?

最佳答案

 r = re.compile('^(There|Did) (( |[A-Za-z])+) (today|yesterday)$')
^ ^ ^

你有一些不必要的东西。把那些去掉,并在你的中间组中包含空格:

r = re.compile('^(There|Did) ([A-Za-z ]+) (today|yesterday)$')
^ space

示例:

>>> r = re.compile('^(There|Did) ([A-Za-z ]+) (today|yesterday)$')
>>> r.search('There was a a cat in the hosue yesterday').groups()
('There', 'was a a cat in the hosue', 'yesterday')

此外,如果您希望这些空格成为中间(第二)组的一部分,请去掉捕获组之间的空格

关于Python 正则表达式为最后一个匹配的字符返回额外的捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33965526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com