Py学习  »  Python

被python的这个“特性”给坑死了

Python之禅 • 3 年前 • 496 次点击  

哈哈哈,被自己蠢死了,也被 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 = """

这是html文本

"""


result=re.sub(r"", "", s)
print(result)

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

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

import re

s = """

这是html文本

"""


result=re.sub(r"", "", s, re.DOTALL)
print(result)

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

作罢,然后去看了文档。


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

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

result=re.sub(r"", "", s, re.DOTALL)

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

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

result=re.sub(r"", "", s, flags = re.DOTALL)

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

最后的结果就是:

<div> 这是html文本div>

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

推荐:
  1. 牛得一批!10分钟用Python编写一个贪吃蛇小游戏

  2. 再见,pycharm

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/71393
 
496 次点击  
文章 [ 1 ]  |  最新文章 3 年前