获取字符串之间的子字符串。但这种情况会发生多次

2024-10-02 22:34:20 发布

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

如果我有以下字符串:

s = 'sdsdsdBetreft:ddddddBetreft:HOOOIIIIgagaga'

如何获得HOOOIIII?你知道吗

我尝试了以下方法:

p = re.search(r'Betreft:(.*?)gagaga', s).group(1)
print(p)

但这给了我:

ddddddBetreft:HOOOIIII

这是因为“Betreft”出现多次。我迷路了。你知道吗

有什么建议吗?你知道吗


Tags: 方法字符串researchgroup建议print迷路
3条回答

如果要确保在最后一个Betreft之前不捕获任何内容,那么一个选项是使用lookarounds。考虑以下回火点:

(?:(?!Betreft:).)*

这意味着消费任何东西,只要我们从不向前看并看到字符串Betreft。在下面模式的上下文中,这是避免在较早出现的Betreft处开始匹配的一种方法。你知道吗

s = 'sdsdsdBetreft:ddddddBetreft:HOOOIIIIgagaga'
p = re.search(r'(?<=Betreft:)(?:(?!Betreft:).)*(?=gagaga)', s).group(0)
print(p)

HOOOIIII

Demo

问题的根源是像.*这样的表达式通常是匹配的 与regex作者的实际意图相比,文本太多了。你知道吗

一种可能的解决方案是匹配除:以外的字符序列, 可能更好的选择是非空变量,因此 正则表达式的一部分应该是:[^:]+。你知道吗

正如您定义的“边框字符串”(在匹配文本之前和之后), 将这两个选项都用作正向向后看正向向前看, 所以整个正则表达式可以是:

(?<=Betreft:)[^:]+(?=gagaga)

您可以在regex前面添加.*,以使用前面出现的所有Betreft:

re.search(r'.*Betreft:(.*?)gagaga', s).group(1)

返回:HOOOIIII

相关问题 更多 >