python基础之---正则表达式

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}?$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值