我们此前已经写过2篇文章解释什么是python
正则表达式,以及python re
库的讲解,如果还未看过这两篇文章的小伙伴,不妨先看看如下文章:
python | 探寻python正则表达式-1:juejin.cn/post/722125…
python | 正则表达式re库常用方法介绍:juejin.cn/post/722173…
以便做到承上启下,无缝连接。
还是在此声明一点,该片文章基于的python
版本为:
关于特殊字符,我们推荐查看python
官方的文档: docs.python.org/zh-cn/3.7/l…
我们今天将要介绍正则表达式的特殊字符,以及含义,和相关的案例。
转义符
在正则表达式中,使用反斜杠``来将特殊字符转义成普通字符,例如文本中有*
,我们就想查询字符*
,就可以使用*
进行转义、还例如特殊字符[
和]
都可以使用如下方式进行转义,这里列举2个例子:
假设有一串电话号码,但是屏蔽了中间4位,为: 180-****-3281
,我们需要匹配进行完整字符串匹配(不用正则特殊字符),应当如何来匹配*
呢?
如果我们直接写re.findall("180-****-3281",'180-****-3281')
则会报错,因为在正则表达式中,*
代表前一个字符出现0
次或者无数次,所以多个*
在一起没有意义,会导致编译正则表达式不过。
如果想将*
就当成普通字符进行匹配,可以在此之前使用``来转义一下,例如:
import re print(re.findall("180-****-3281",'180-****-3281'))
这样就可以将这个完整给匹配出来,运行结果为:
再来一个例子,假设有一个日志文件logs.txt
我们想匹配下[err]
类型日志出现的整行。这个应该如何匹配呢?
我们可以使用re.match
来做匹配开头为[err]
的即可,例如:
import re for line in open('logs.txt'): if re.match('[err]',line): print(line)
运行后,我们可以看到,可以正常输出记录。
多个正则表达式
可以使用特殊字符|
来将多个正则表达式分开,例如: re1|re2
就会匹配re1
正则表达式 和 re
正则表达式。
例如: 针对一串字符串,我们即想匹配pdudo
又想匹配juejin
,则我们可以使用pdudo|juejin
。
import re print(re.findall("pdudo|juejin","hello juejin , hello pdudo"))
上述代码,执行后,输出结果为:
任意字符
可以使用特殊字符.
来匹配一个任何一个特殊字符,通常和特殊字符*
配合使用。
例如使用pd.do
即可匹配pdudo
、pdodo
等,代码如下:
re.findall("pd.do","pdudo pdodo")
0次或多次前面的出现的字符串或者正则表达式
使用*
可以匹配0次或者多次前一个字符串,通常和特殊字符.
配合使用。
这个例子放到后面来讲解。
字符串起始和结尾部分
可以使用特殊字符^
来匹配字符串起始,使用$
来匹配字符串结尾,例如想匹配以p
开头的并且以d
结尾的字符串,可以这样写:
re.findall("p.*o","pdudo")
来自合集的内容
可以使用[...]
来匹配字符集的单一字符,其中...
可以是范围,例如:
[0-9]
: 将匹配 0-9 中的任何一个值
[abc]
: 将匹配abc中的任何一个字符串
[^abc]
: 在前面加一个取反符号^
,则不匹配范围的字符
这个例子放到后面来讲解。
n次前面出现的字符串或者正则表达式
可以使用{n}
来匹配前面出现的n次表达式,例如: a{3}
将匹配为aaa
。
例如想匹配电话号码:
re.findall("1[0-9]{2}-[0-9]{4}-[0-9]{4}","180-2134-1234")
上述,[0-9]
代表范围,后面{n}
代码前一个字符出现n
次。
另存为数组
使用(...)
会将匹配到的正则表达式,另存为自组,在爬虫用的比较多,这里举个例子:
import re print(re.findall("^下载链接为:(.*),请用迅雷下载$","下载链接为:www.juejin.cn/123/456,请用迅雷下载"))
上述会匹配以下载链接为:
开头,并且以,请用迅雷下载
为结尾的字符串,且将匹配到的信息另存为数组,即(.*)
中间的内容。
所以执行的结果为:
总结
这篇文章,详细介绍了python
正则表达式特殊字符的含义,以及其用法。 再结合之前的2篇文章,相信你会对python
正则表达式有一个初步的了解。