之前,我们曾经介绍过正则表达式如何在介绍linux中grep命令的时候,顺带说明了正则表达式相关语法。
本文,我们来看下如何在python中实现对正则化的处理。
1. python中re模块的用法
python通过re模块实现对正则化的解析。具体常用函数,如下表所示。之外,如果函数范围的是正则表达式对象,对象同样调用这些自己的函数。
如果一个pattern需要重复使用,我们应该调用compile生成对应re对象。
其中前几个函数很常用。
2. 补充re的语法
除了在grep中提到的一些常用的字符含义之外,还有一些转义字符能够更加快速准确表达字符串的pattern
符号 | 解释 |
---|---|
\d | 直接匹配数字,与[0-9]同等效果,速记digiti |
\w | 匹配所有的字母数字和下划线,速记word |
\s | 匹配所有的空白,包括\t\n\r等等,速记space |
同样的,如果上述符号字母为大写的话,含义就是取反的意思。
比如:
使用\D
就可以匹配所有的不包含digital的字符串
符号 | 解释 |
---|---|
?:exp | 匹配exp但不捕获匹配的文本 |
?=exp | 匹配exp前面的位置 |
?<=exp | 匹配exp后面的位置 |
?!exp | 匹配后面不是exp的位置 |
?<!exp | 匹配前面不是exp的位置 |
应用实例
光说不练,等于白学。我们来练习下上述提及到的相关函数操作。
-
用户名必须由字母、数字或下划线构成且长度在6-20个字符之间,QQ号是5~12的数字且首位不能为0
m1 = re.match(r'^\w{6,20}$', username) m2 = re.match('^[1-9]\d{4,11}$', qq)
根据返回结果是否为none,可以判断匹配是否成功。
-
在一段文字中提取国内手机号码
sentence = ''' 重要的事情说8130123456789遍,我的手机号是13512346789这个靓号, 不是15600998765,也是110或119,王大锤的手机号才是15600998765。 ''' pattern = re.compile(r'(?<=\D)1[34578]\d{9}(?=\D)') # 查找所有匹配并保存到一个列表中 mylist = re.findall(pattern, sentence) # 通过迭代器取出匹配对象并获得匹配的内容 for temp in pattern.finditer(sentence): print(temp.group()) # 通过search函数指定搜索位置找出所有匹配 m = pattern.search(sentence) while m: print(m.group()) m = pattern.search(sentence, m.end())
分析:
其中函数re.compile()
编译()中的正则表达式并返回正则表达式对象。
返回搜索结果对象的时候,有如下几种方式:- 使用
re.findall()
- 正则表达式对象调用
finditer()
函数,通过迭代器取出来 - 正则表达式对象调用
search()
函数,通过指定位置找出匹配
至于正则表达式中的撰写,我们需要注意其中
(?<=\D)
的应用,这表明我们是在非数字的字符串之后进行匹配工作。同样(?=\D)
表明,我们是在非数字字符串之前进行匹配。通过这两项的控制,可以使得整个匹配工作限制在数字范围内。 - 使用
-
替换字符串中的不良内容
re.sub(r'cao|[草艹]|fuck|shit|傻[b比笔]','*',sentence,flag=re.IGNORECASE)
re模块的正则表达式相关函数中都有一个flags参数,它代表了正则表达式的匹配标记,可以通过该标记来指定匹配时是否忽略大小写、是否进行多行匹配、是否显示调试信息等。如果需要为flags参数指定多个值,可以使用按位或运算符进行叠加,如flags=re.I | re.M
-
拆分字符串
sentence_list = re.split(r'[,。, .]', poem)
拆分之后,返回一个list