正则表达式
一,正则表达式介绍
-
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。
-
使用库
import re
二,re模块下的match方法
匹配单的字符串
字符 | 功能 |
---|---|
. | 匹配任意1个字符(除了\n) |
[ ] | 匹配[ ]中列举的字符 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字,即不是数字 |
\s | 匹配空白,即 空格,tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z、A-Z、0-9、_ |
\W | 匹配非单词字符 |
量词
?
匹配前面的字符0次或1次\*
匹配前面的字符0次或多次\+
匹配前面的字符1次或者多次{m}
匹配前面表达式m次{m,}
匹配前面表达式至少m次{,n}
匹配前面的正则表达式最多n次{m,n}
匹配前面的正则表达式至少m次,最多n次注意点:以上量词都是贪婪模式,会尽可能多的匹配,如果要改为非贪婪模式,通过在量词后面跟随一个?来实现。
组与捕获
1、()
的作用:
- 捕获
()
中正则表达式的内容以备进一步利用处理,可以通过在左括号后面跟随?:
来关闭这个括号的捕获功能。 - 将正则表达式的一部分内容进行组合,以便使用量词或者
|
。
2、反向引用前面()
内捕获的内容:
- 通过组号反向引用
每一个没有使用?:
的小括号都会分配一个组好,从1开始,从左到右递增,可以通过\i
引用前面()
内表达式捕获的内容 - 通过组名反向引用前面小括号内捕获的内容
可以通过在左括号后面跟随?P<name>
,尖括号中放入组名来为一个组起一个别名,后面通过(?P=name)
来引用前面捕获的内容。如(? P<word>\w+)\s+(?P=word)
来匹配重复的单词。
注意点:
反向引用不能放在字符类[]
中使用。
断言
^
在起始处匹配,如果有MULTILINE标志,则在每个换行符后匹配
$
在结尾处匹配,如果有MULTILINE标志,则在每个换行符前匹配
注:match方法默认为其实处匹配
三,re模块其它方法
rx.findall(s,start, end):
返回一个列表,如果正则表达式中没有分组,则列表中包含的是所有匹配的内容,
如果正则表达式中有分组,则列表中的每个元素是一个元组,元组中包含子分组中匹配到的内容,但是没有返回整个正则表达式匹配的内容rx.finditer(s, start, end):
返回一个可迭代对象
对可迭代对象进行迭代,每一次返回一个匹配对象,可以调用匹配对象的group()
方法查看指定组匹配到的内容,0表示整个正则表达式匹配到的内容rx.search(s, start, end):
返回一个匹配对象,倘若没匹配到,就返回None
search()
方法只匹配一次就停止,不会继续往后匹配rx.match(s, start, end):
如果正则表达式在字符串的起始处匹配,就返回一个匹配对象,否则返回Nonerx.sub(x, s, m):
返回一个字符串。每一个匹配的地方用x
进行替换,返回替换后的字符串,如果指定m
,则最多替换m
次。对于x
可以使用/i
或者/g<id>id
可以是组名或者编号来引用捕获到的内容。
模块方法re.sub(r, x, s, m)
中的x
可以使用一个函数。此时我们就可以对捕获到的内容推过这个函数进行处理后再替换匹配到的文本。rx.subn(x, s, m):
与re.sub()
方法相同,区别在于返回的是二元组,其中一项是结果字符串,一项是做替换的个数。rx.split(s, m):
分割字符串,返回一个列表,用正则表达式匹配到的内容对字符串进行分割
如果正则表达式中存在分组,则把分组匹配到的内容放在列表中每两个分割的中间作为列表的一部分- m.group( )
返回编号或者组名匹配到的内容,默认或者0表示整个表达式匹配到的内容,如果指定多个,就返回一个元组
四,总结
- 对于正则表达式的匹配功能,Python没有返回true和false的方法,但可以通过对
match()
或者search()
方法的返回值是否是None来判断。 - 对于正则表达式的搜索功能,如果只搜索一次可以使用
search()
或者match()
方法返回的匹配对象得到,对于搜索多次可以使用finditer()
方法返回的可迭代对象来迭代访问。 - 对于正则表达式的替换功能,可以使用正则表达式对象的
sub()
或者subn()
方法来实现,也可以通过re模块方法sub()
或者subn()
来实现,区别在于模块的sub()
方法的替换文本可以使用一个函数来生成。 - 对于正则表达式的分割功能,可以使用正则表达式对象的
split()
方法,需要注意如果正则表达式对象有分组的话,分组捕获的内容也会放到返回的列表中。
示例
import re
x = ["13915556234", "13025621456", "15325645124", "15202362459"]
for str in x:
is_right = re.findall(r"\b13[4-9]\d{8}\b|\b15[01289]\d{8}\b",str)
if(is_right):
print(is_right)
结语
如果愿意点个赞,加个关注的话,梦码在这里感激不尽,你小小的行为,确实对我成长路上的巨大鼓励