登录
首页大数据时代被python的这个“特性”给坑死了
被python的这个“特性”给坑死了
2020-07-16
收藏

以下文章来源: Python之禅

作者: 刘志军

哈哈哈,被自己蠢死了,也被 python 的语法给坑死了。没想到还会遇到这种问题。

事情是这样的。

项目中遇到一个字符串替换的问题。

我们知道字符串替换可以直接用replace方法,但这个方法只适合简单的字符替换,就是前提你要明确知道你要替换什么。

例如把“java”去掉

s = "java python"
print(s.replace("java", "")) # python

遇到复杂场景就不得不用正则表达式的方法来替换了。

比如有一段html文本

s = """
<script>
!function(e)
w3i9df
xxx
</script>
<div> 这是html文本</div>
"""

我想把script脚本去掉,只保留html文本。这时候可以正则表达式里面的 re.sub 方法来实现。

import re

s = """
<script>
!function(e)
w3i9df
xxx
</script>
<div> 这是html文本</div>
"""

result=re.sub(r"<script.*?</script>", "", s)
print(result)

运行后发现还是原来的文本,是我的正则表达式写的不对么?

其实这是因为,字符串中有换行符, 但是 . 是无法匹配换行符等特殊符号的,这时需要一个标志参数叫 re.DOTALL , 它可以让正则表达式中的点(.)匹配包括换行符在内的任意字符。

import re

s = """
<script>
!function(e)
w3i9df
xxx
</script>
<div> 这是html文本</div>
"""

result=re.sub(r"<script.*?</script>", "", s, re.DOTALL)
print(result)

于是我加上了标志参数,发现还是没法匹配。我就很郁闷了。尝试好几次都没效果。

作罢,然后去看了文档。

原来这个函数有两个可选的位置参数,平时没注意过。count 表示替换的最大次数。flags 才是标志参数。

在调用时,如果指定参数名字时

result=re.sub(r"<script.*?</script>", "", s, re.DOTALL)

那么 re.DOTALL 就会作为 count 参数的值传过去了,等于你并没有给 flags 指定值,用的还是默认的值。

所以,在调用的时候,一定要显示的指定参数名。

result=re.sub(r"<script.*?</script>", "", s, flags = re.DOTALL)

这样就能正常匹配表达式了。

最后的结果就是:

<div> 这是html文本</div>

python的函数参数是一个很迷的问题,如果要把函数的参数使用全部讲清楚,可以花很多篇幅来讲。今天快速记录下这个问题,也是告诉大家遇到类似的问题时,别掉坑里面了。

数据分析咨询请扫描二维码

客服在线
立即咨询