让代码更简单

记录几个python正则相关的问题

重要:本文最后更新于2023-01-01 09:18:54,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

最近在写采集站的python程序的时候,遇到几个小问题,虽然问题小,但还是挺磨人的,这里记录一下,以便查阅,再次吐槽下百度搜索环境,真的是各种抄,正经答案搜不出来。

正则贪婪模式:默认情况下python的re模块正则默认使用贪婪匹配,如果你发现匹配结果不正确,可以尝试在正则后面加上?来取消贪婪模式。

例如下面是一个匹配<pre>标签内容的正则

复制
<pre.*>(.*)</pre>

如果你的内容中有多个pre标签,很有可能只得到一个结果,正确的正则应取消贪婪匹配,如下

复制
<pre.*?>(.*?)</pre>

正则替换时,路径带有\导致正则报错。

例如:使用如下代码替换时,会报错,原因是路径中的\被识别为转义

复制
data="""<pre>$$$###</pre>"""
regex = '<pre.*?>(.*?)</pre>'
r=re.sub(regex,"<mypre>Me\Task\DeferredServiceLis</mypre>",data,1,re.DOTALL)

正确做法,应将替换内容用repr函数转换下

复制
data="""<pre>$$$###</pre>"""
regex = '<pre.*?>(.*?)</pre>'
r=re.sub(regex,repr("<mypre>Me\Task\DeferredServiceLis</mypre>"),data,1,re.DOTALL)

上面的办法还不够保险,可以使用lambda m: z,实测非常完美,示例如下

复制
data="""<pre>$$$###</pre>"""
regex = '<pre.*?>(.*?)</pre>'
z="<mypre>Me\Task\DeferredServiceLis</mypre>"
r=re.sub(regex,lambda m: z,data,1,re.DOTALL)

感觉很棒!可以赞赏支持我哟~

0 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐