python基础之—正则表达式
文章目录
一、正则化表达式简介
正则表达式在网络爬虫、数据分析中有着广泛使用,掌握正则表达式能够达到事半功倍的效果。
二、字符匹配
2.1方法和功能
方法 | 功能 |
---|---|
match() | 判断一个正则表达式是否从开始处匹配一个字符串 |
search() | 遍历字符串,找到正则表达式匹配的第一个位置,返回匹配对象 |
findall() | 遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回。如果给出的正则表达式中包含子组,就会把子组的内容单独返回,如果有多个子组就会以元组的形式返回。 |
finditer() | 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回 |
- 示例
import re
arr = re.findall('123', 'runoob 123 google 456')
#匹配123
print(arr)
arr = re.match('runoob', 'runoob 123 google 456')
#re.match 匹配开头
print(arr)
arr=re.search('123', 'runoob 123 google 456')
#re.search 匹配到正则表达式匹配的第一个位置
print(arr)
print("--------------")
arr=re.finditer('123', 'runoob 123 google 123')
for i in arr:
print(i)
2.2 特殊字符
特殊字符 | 含义 |
---|---|
\d | 匹配任何十进制数字;相当于类 [0-9] |
\D | 与 \d 相反,匹配任何非十进制数字的字符;相当于类 [^0-9] |
\s | 匹配任何空白字符(包含空格、换行符、制表符等);相当于类 [ \t\n\r\f\v] |
\S | 与 \s 相反,匹配任何非空白字符;相当于类 [^ \t\n\r\f\v] |
\w | 匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式[a-zA-Z0-9_] |
\W | 于 \w 相反 (注:re.ASCII 标志使得 \w 只能匹配 ASCII 字符) |
\b | 匹配单词的开始或结束 |
\B | 与 \b 相反 |
- 练习
import re
# \d 表示数字
arr = re.findall('\dcm', '我的身高是178cm 体重是66kg 厘米是cm')
print(arr)
# \D 表示非数字
arr = re.findall('\Dcm', '我的身高是178cm 体重是66kg 厘米是cm')
print(arr)
#\s 表示空格
arr = re.findall('\s体', '我的身高是178cm 体重是66kg 厘米是cm')
print(arr)
# \S 表示非空格
arr = re.findall('\S', '我的身高是178cm 体重是66kg 厘米是cm')
print(arr)
# \w 表示字母数字下划线
arr = re.findall('\w', '我的身高是\ncm 体重是\n66kg 厘米是\ncm')
print(arr)
# \W 表示非字母数字下划线
arr = re.findall('\W', '我的身高是\ncm 体重是\n66kg 厘米是\ncm')
print(arr)
# \b 表示单词边界
arr = re.findall('\bz', 'zhl')
print(arr)
['8cm']
['是cm']
[' 体']
['我', '的', '身', '高', '是', '1', '7', '8', 'c', 'm', '体', '重', '是', '6', '6', 'k', 'g', '厘', '米', '是', 'c', 'm']
['我', '的', '身', '高', '是', 'c', 'm', '体', '重', '是', '6', '6', 'k', 'g', '厘', '米', '是', 'c', 'm']
['\n', ' ', '\n', ' ', '\n']
[]
三,数量控制
2.1 *重复0次或多次
#匹配前面的字符0次或1次
arr=re.findall("66*6", "zhl66666")
print(arr)
['66666']
2.2 +重复1次或多次
#匹配前面的字符1次或多次
arr=re.findall("[0-5]+jpg", "zhl123542jpg")
print(arr)
['123542jpg']
2.3 ?重复1次或0次
#匹配前面的字符0次或1次
arr=re.findall("[0-5]?jpg", "zhl123542jpg")
print(arr)
['2jpg']
2.4 {n}重复n次
#匹配前面的字符n次
arr=re.findall("[0-5]{3}jpg", "zhl123542jpg")
print(arr)
['542jpg']
2.5 {n,}重复n次或多次
#匹配前面的字符n次或更多次
arr=re.findall("[0-5]{3,}jpg", "zhl123542jpg")
print(arr)
['123542jpg']
2.6 {n,m}重复n到m次
#匹配前面的字符n次或n次以上
arr=re.findall("[0-5]{3,5}jpg", "zhl123542jpg")
print(arr)
['23542jpg']
四,分组
4.1()提取兴趣区域
# ()提取兴趣区域
import re
text = '子恒,把鸡蛋弹碎,弹碎给你我的电话号码16609549548,qq2579478480号码'
data = re.findall(r'号码(\d+)',text)
print(data)
['16609549548']
4.2(|)提取兴趣区域(| = or)
# (|)提取兴趣区域
text = '子恒,把鸡蛋弹碎,弹碎给你我的电话号码16609549548,qq2579478480号码jpg'
data = re.findall(r'号码(\d{11}|jpg)',text)
print(data)
['16609549548', 'jpg']
五,开始和结束
5.1^开始
#开始
import re
text = '子恒,把鸡蛋弹碎,弹碎给你我的电话号码16609549548,qq2579478480号码'
data = re.findall(r'257\d+',text)
print(data)
['2579478480']
5.2$结尾
#结束
import re
text = 'qq2579478480,qq2579478481'
data = re.findall(r'qq\d+$',text)
print(data)
['qq2579478481']
六,特殊字符
- 由于正则表达式中* . \ {} () 等等符号具有特殊含义,如果你指定的字符正好就是这些符号,需要用\进行转义
import re
text = "数学中集合的写法是{2}"
data = re.findall(r"\{2\}", text)
print(data) # ['{2}']
['{2}']
七, 常用方法
7.1 re.findall
获取匹配到的所有数据
import re
arr = re.findall('123', 'runoob 123 google 456')
#匹配123
print(arr)
['123']
7.2re.match
从字符串的起始位置匹配,成功返回一个对象否则返回none。
匹配成功返回对象,对象的方法:
方法 | 功能 |
---|---|
group() | 返回匹配的字符串 |
start() | 返回匹配的开始位置 |
end() | 返回匹配的结束位置 |
span() | 返回一个元组表示匹配位置(开始,结束) |
arr = re.match('runoob', 'runoob 123 google 456')
#re.match 匹配开头
print(arr)
<re.Match object; span=(0, 6), match='runoob'>
7.3 re.search
扫描整个字符串并返回第一个成功匹配的字符串。成功返回一个对象否则返回none
arr=re.search('123', 'runoob 123 google 456')
#re.search 匹配到正则表达式匹配的第一个位置
print(arr)
<re.Match object; span=(7, 10), match='123'>
7.4 re.sub
替换匹配成功的字符
类似与字符串的replace函数
#re.sub
arr=re.sub('123', '456', 'runoob 123 google 123')
print(arr)
runoob 456 google 456
7.5 re.split
根据匹配成功的位置对字符串进行分割
#re.split
arr=re.split('\s', 'runoob 123 google 123')
print(arr)
['runoob', '123', 'google', '123']
7.6 re.finditer
类似findall 但是不会全部返回出来 而是返回迭代器(比如匹配成功了10万个 全部返回就很吃内存了)
arr=re.finditer('123', 'runoob 123 google 123')
for i in arr:
print(i)
<re.Match object; span=(7, 10), match='123'>
<re.Match object; span=(18, 21), match='123'>
八,常见正则
QQ号:[1 - 9][0 - 9]{4, }(腾讯QQ号从10000开始)
帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
手机号码:^(13[09]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
身份证号(15位、18位数字):^\d{15}|\d{18}$
短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$