2024-10-02 22:34:20 发布
网友
如果我有以下字符串:
s = 'sdsdsdBetreft:ddddddBetreft:HOOOIIIIgagaga'
如何获得HOOOIIII?你知道吗
HOOOIIII
我尝试了以下方法:
p = re.search(r'Betreft:(.*?)gagaga', s).group(1) print(p)
但这给了我:
ddddddBetreft:HOOOIIII
这是因为“Betreft”出现多次。我迷路了。你知道吗
有什么建议吗?你知道吗
如果要确保在最后一个Betreft之前不捕获任何内容,那么一个选项是使用lookarounds。考虑以下回火点:
Betreft
(?:(?!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::
Betreft:
re.search(r'.*Betreft:(.*?)gagaga', s).group(1)
返回:HOOOIIII
如果要确保在最后一个
Betreft
之前不捕获任何内容,那么一个选项是使用lookarounds。考虑以下回火点:这意味着消费任何东西,只要我们从不向前看并看到字符串
Betreft
。在下面模式的上下文中,这是避免在较早出现的Betreft
处开始匹配的一种方法。你知道吗Demo
问题的根源是像
.*
这样的表达式通常是匹配的 与regex作者的实际意图相比,文本太多了。你知道吗一种可能的解决方案是匹配除
:
以外的字符序列, 可能更好的选择是非空变量,因此 正则表达式的一部分应该是:[^:]+
。你知道吗正如您定义的“边框字符串”(在匹配文本之前和之后), 将这两个选项都用作正向向后看和正向向前看, 所以整个正则表达式可以是:
您可以在regex前面添加
.*
,以使用前面出现的所有Betreft:
:返回:
HOOOIIII
相关问题 更多 >
编程相关推荐