正则表达式
一、概述
1. 正则表达式,也称为规则表达式,(英文:Regular Expression,简称:regex或re)Python中的模块import re
2. 正则表达式通常用来检索、判断、替换那些符合某个规则(模式)的字符串
3. 正则表达式并不是Python独有的
4. 正则表达式是对字符串【普通字符串:a-z A-Z】和特殊字符【称为'元字符'】进行操作的一种逻辑公式(式子)
二、re模块
import re # 导入re模块
re.findall(正则表达式,待检索的字符串)
# 正则表达式可以是 普通字符串 也可以是 元字符串
# 返回一个列表,元素是符合要求的字符串
import re
regex = 'abc'
string = 'abc3251dabceqadfabcew52'
result = re.findall(regex,string)
print(result)
三、元字符
上述示例只能查找普通字符串,如果想查询包含某种规则的字符串,就需要使用到元字符.re.findall('abc\d+d$','abc12423d')
1. [] 表示一个字符集或字符范围
- [xyz] 表示查找x或y或z的字符
- [a-z] 表示 a-z范围内的所有字符
- [0-9] 表示 0-9 字符
- [^a-z] 不包含a-z的字符
# 示例
# 查找所有的x和y及z的字符
print(re.findall('[xyz]','2905rt30sazyassadfxsdfy'))
# 查找fx、fy、fz的字符
print(re.findall('f[xyz]','2905rt30sazyassadfxsdfy'))
2. ^
匹配行首 ^abc 表示是以abc开头的
3. $
匹配行尾 d$ 表示以d结尾的
# 在集成环境Pycharm中Django框架 url文件中可以有 url('^index/$')
print(re.findall('a','aadsfasdfasdfadsa')) # 找到所有的a
print(re.findall('^a','aadsfasdfasdfadsa')) # 行首的a
print(re.findall('a$','aadsfasdfasdfadsa')) # 行尾的a
4. \ (反斜杠)
反斜杠后面加不同的字符,表示不同的特殊含义
\d 匹配任何的十进制的数 等价于[0-9]
\D 匹配任何的非十进制的数 等价于[^0-9]
\s 匹配任何的空白字符 \t \n \r
\S 同上取反
\w 匹配任何的字母、数字、下划线 [a-zA-Z0-9_]
\W 同上取反
\ 可以转义 用于取消元字符变成普通字符
print(re.findall('\d','aa1414dsfa _ sd\tfas\ndfadsa'))
5. {n} 匹配n次 \d{3}
{n,} 至少匹配n次
{n,m} 匹配n到m次
print(re.findall('\d{4}','aa1414dsfa _ sd\tf2354as\ndf12adsa'))
print(re.findall('\d{2,4}','aa1414dsfa _ sd\tf2354as\ndf12adsa'))
6. *
指定一个字符可以匹配零次或多次
print(re.findall('a[1-9]*','adafa141adsfdfd'))
# -> ['a', 'a', 'a141', 'a']
7. +
匹配一次或多次
print(re.findall('a[1-9]+','adafa141adsfdfd')) # -> ['a141']
8. ?
匹配一次或零次
print(re.findall('a[1-9]?','adafa141adsfdfd'))
# -> ['a', 'a', 'a1', 'a']
9. .
匹配除\n和\r之外的任意的单个字符
print(re.findall('.+','adafa141a\ndsfdfd'))
# +或*是贪婪模式
print(re.findall('a[0-9]+','adafa141adsfdfd'))
# ?是非贪婪模式
print(re.findall('a[0-9]?','adafa141adsfdfd'))
四、正则函数
1、re.match()函数
# match(pattern, string, flags=0)
尝试从字符串的起始位置匹配一个模式(规则),如果匹配不成功返回为None
print(re.match('baizhi','baizhiPython')) # 返回match对象
print(re.match('\w{3}baizhi','abcbaizhiPython'))# 返回match对象
print(re.match('010-[0-9]{6}','010-123456'))# 返回match对象
print(re.match('010-[0-9]{6}','010-1234567'))# 返回match对象
print(re.match('^010-[0-9]{6}$','010-1234567'))# 返回None
2、re.search()函数
# search(pattern, string, flags=0)
扫描整个字符串并返回第一个成功的匹配
print(re.search('abc','abaadfabcasdfaabc'))
3、re.findall()函数
# findall(pattern, string, flags=0)
查找所有匹配的字符串,返回一个列表
4、re.finditer()函数
# finditer(pattern, string, flags=0)
和findall类似,查找所有匹配的字符串,返回值为一个迭代器
for i in re.finditer('abc','abaadfabcasdfaabc'):
print(i) # 每一个元素是一个Match的对象
5、re.split()函数
# split(pattern, string, maxsplit=0, flags=0)
split方法按照规则将字符串分割后返回列表
print(re.split(';','adsfa;adsasdf;adsf a; adsfa'))
print('adsfa;adsasdf;adsf a; adsfa'.split(';'))
print(re.split('[;,]','adsfa;ads,asd,f;ad,sf a; adsfa'))
print(re.split('[;,\s]','ad sfa;ads,as\nd,f;ad,sf a; adsfa'))
6、re.sub()函数
# sub(pattern, repl, string, count=0, flags=0)
用于替换字符串的匹配项
number = '010-123456-86# 这是一个固定电话'
print(re.findall('#.*$', number))
print(re.sub('#.*$', '', number)) # 查找并替换
print(''.join(re.findall('\d',number)))
print(re.sub('\D','',number))
-
match对象
1. span() 返回一个元组 (开始,结束)位置 2. start() 匹配的字符串的开始位置 3. end() 匹配的字符串的结束位置 4. group() 匹配的字符串
print(re.search('abc\w+', 'abaadfabcasdfaabc').group()) print(re.finditer('abc\w?', 'abaadfabcasdfaabc')) for i in re.finditer('abc\w?', 'abaadfabcasdfaabc'): print(i.group())
五、分组
email1 = 'hello@163.com'
email2 = 'hello@qq.com'
email3 = 'he_llo@126.com'
print(re.findall('^([a-zA-Z0-9]{1,})@(163|126|qq)\.(com|cn|org)',email1)) # \1 \2 \3对应每一个捕获组
print(re.findall('<a>(.*)</a>','<div><a>www.baidu.com</a></div>'))