手机版

正则表达式re.sub的不完全替换及其完全解

时间:2021-08-30 来源:互联网 编辑:宝哥软件园 浏览:

title:中正则表达式re.sub的不完全替换及其根本原因

to c : TrueComment : Truedate : 2018-08-27 21:48:22 tags :[' Python ','正则表达式'] Category 3360 ['Python']-

问题描述

问题的原因来自于一次常规的换人。要从一段HTML代码中提取文本并移除所有的HTML标签和属性,您可以编写一个Python函数:

导入redef remove _ tag(html): text=re . sub('。*?','',html,re。s)返回文本这段代码使用正则表达式的替换函数re.sub。此函数的第一个参数表示需要替换的内容的正则表达式。由于HTML标记用尖括号括起来。*?您可以匹配所有xxx yyy='zzz '和/xxx。

第二个参数指示匹配的内容将替换哪些内容。因为我需要提取文本,所以我只需要用空字符串替换所有的HTML标签。第三个参数是需要替换的文本,在本例中是HTML源代码段。

至于re。我在四年前的一篇文章《https://www.jb51.net/article/146384.htm》中谈到了它的用法

现在使用一段HTML代码来测试它:

导入redef remove _ tag(html): text=re . sub('。*?','',html,re。s)返回文字来源_ 1=''' div class=' content '今天的主角是a href='xxx'kingname/a,让我们鼓掌!/div ' ' ' text=remove _ tag(source _ 1)print(text)如下图所示运行,其功能完全符合预期

让我们测试一下代码中有换行符的情况:

导入redef remove _ tag(html): text=re . sub('。*?','',html,re。s)返回文字来源_ 2=''' div class=' content '今天的主角是a href='xxx'kingname/a,让我们鼓掌!/div ' ' ' text=remove _ tag(source _ 2)print(text)如下图所示运行,完全符合预期。

经过测试,在大多数情况下,文本可以从HTML代码段中提取出来。但也有例外。

例外

有一个很长的HTML代码段,内容如下:

img/span span met king name/span/a span class=' URL-icon ' img/span span温柔/span/a span #清南#/span/a br/就在这里…br/我的小王子呢?运行效果如下图所示,最后两个HTML标签替换失败。

起初,我认为这是由HTML中的空格或引号引起的,所以我简化了HTML代码:

img/span span span met king name/span/a span mg/span span温柔/span/a span # qingnan #/span/ABR/就在这里…br/我的小王子的问题依然存在,如下图所示。

更令人惊讶的是,如果删除第一个标签img,替换结果中就会少一个标签,如下图所示。

事实上,不仅删除第一个标签,而且删除任何以前的标签都可以减少结果中的一个标签。如果删除前两个或更多标签,结果是正常的。

常见问题解答

这个看似奇怪的问题的根本原因在于re.sub的第四个参数,从函数原型可以看出:

def sub的第四个参数(模式,repl,字符串,count=0,flags=0)是count,表示替换号,re。如果要使用的话,应该使用s作为第五个参数。因此,如果remove_tag函数被修改,结果是正确的:

def remove _ tag(html): text=re . sub('。*?','',html,flags=re。s)返回文本然后问题来了,放re。s在count的位置,为什么代码没有报错?是re。这是一个数字吗?事实上,如果你把它打印出来,你会发现戒指。s真的可以用作数字:

导入重新打印(int(re。S))16现在,我回去统计有问题的HTML代码,发现最后两个额外的br标签只是第17个和第18个标签。自从re。按计数填写的s可以视为16,Python将用空字符串替换前16个标签,留下最后两个。

在这一点上,问题的原因很清楚。

这个问题没有被早期发现有几个原因:

被替换的HTML代码是一个代码段。大多数情况下,HTML标签不到16个,所以问题是隐藏的。Re。s是一个对象,但也是一个数字,count接收的参数恰好是一个数字。在许多编程语言中,常数用数字表示,然后用有意义的大写字母表示。戒指。s处理是div \n而不是div\n/div,但是测试的代码段的标签是第二种情况,所以加re的效果。代码段中的s是相同的。

补充:下面介绍正则表达式re.sub()的替换函数

Re.sub()替换功能

Re.sub是正则表达式函数,用于通过正则表达式替换比普通字符串替换更强大的替换函数。使用replace()可以实现简单的替换功能。

def main(): text='123,word!'text1=text.replace('123 ',' Hello ')print(text 1)if _ _ name _ _==' _ _ main _ _ ' : main()# Hello,wold!如果您通过re.sub(0)函数,您可以匹配任何数字并替换它:

导入redef main(): Content=' ABC 124 hello 46 goodbye 67 shit ' list 1=re . findall(r ' \ d ',Content)print(list 1)my list=list(map(int,list 1))print(my list)print(sum(my list))print(re . sub(r ' \ d[Hg]',' foo1 ',Content))print()print(re . sub(r ' \ d ',' 456654 ',Content))if _ _ name _=' _ _ main _ _ ' 33666

以上就是边肖介绍的正则表达式re.sub的不完全替换问题及完整解决方案。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!

版权声明:正则表达式re.sub的不完全替换及其完全解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐