正则表达式使用零宽断言截取字符串

文章介绍了如何使用正则表达式的零宽断言功能来提取特定格式的字符串,特别是在Python中,如`(?<=start)[sS]*(?=end)`用于匹配`start`和`end`之间的内容而不包含这两个词。同时,提到了在C++的boost/regex库中,零宽断言不支持*、+、?等限定符,而Python则允许这样的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用正则表达式的过程中,有时候需要提取aaa开头bbb结尾的字符串,这个时候正则表达式的零宽断言就显的非常有用了,例如下面的例子:

str = 
'''
start
import re
aaa
bbb
ccc
ddd
end
xxxx
end
'''
我们需要截取上述字符串start和第一个end中间的内容,并且不包含start和end,此时的正则表达式可以这么写:
#r"(?<=start)[\s\S]*(?=end)"
str2 = re.search(r"(?<=start)[\s\S]*?(?=end)", str).group()
print(str2) #输出 '''import re
aaa
bbb
ccc
dd'''

正则规则中, (?<=start)表示的是匹配start开始的位置并且不包含start,(?=end)表示的是end结尾的位置并且不包含end,[\s\S]?表示多行匹配所有字符(包括换行符)并且寻找最短的字符,[\s\S]?中的?正则的贪婪与懒惰规则。
在这里插入图片描述

  • 在C++代码中,例如使用boost/regex,零宽断言表达式中不能使用*、+、?等限定符,例如"(?<=\d+)asd",这种是语法错误的!!! boost/regex的说明文档在这一页

  • 但是在python中,是可以的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值