一、正则表达式符号
正则表达式是用来做字符串查找, 匹配, 切割用的一种工具。python 对正则表达式的支持: 提供了re模块(python内置模块), 包含字符串匹配查找切割等相关方法。
正则表达式是一个符合正则规范的字符串。
正则表达式的字符串, 前面一般要加r阻止转义(正则表达式中有很多'\')
1..
: 匹配任意字符
re_str = r'.'
re_str1 = r'..' # 匹配两个任意字符
re_str2 = r'abc' # 只能匹配'abc'
re_str3 = r'a.' # 匹配a开头的长度为2的字符串
r = re.fullmatch(re_str2, 'ab')
print(r)
2. \w
: 匹配一个是字母,数字或下划线的字符
re_str2_1 = r'\w'
re_str2_2 = r'\w\w' # 匹配两个字母数字或下划线
r = re.fullmatch(re_str2_1, 'e')
print(r)
3. \s
: 匹配一个空白字符(空格, 回车, 制表符)
re_str3_1 = r'\s\s\s' # 匹配三个空白字符
r = re.fullmatch(re_str3_1, ' ')
print(r)
4. \d
: 匹配一个数字字符
re_str4_1 = r'\d'
r = re.fullmatch(re_str4_1, '6')
print(r)
5. \b
: 检测边界(字符串开头, 字符串结尾)(单词边界)
re_str5_1 = r'.....\b' # (检测五个任意字符后是边界的字符串)
re_str5_2 = r'\b.....' # (检测五个任意字符前是边界的字符串)
r = re.match(re_str5_1, 'hello ')
r2 = re.match(re_str5_1, 'hello ')
print(r, r2)
6. ^
: 匹配字符串的开始(^The -- 匹配以'The'开头的字符串)
re_str6_1 = r'^The'
r = re.fullmatch(re_str6_1, 'The')
print(r)
7. $
: 匹配字符串结束
re_str7_1 = r'...abc$'
r = re.fullmatch(re_str7_1, '卫计委abc')
print(r)
8. \W
: 匹配非数字,字母,下划线
re_str8_1 = r'\W'
r = re.fullmatch(re_str8_1, '&')
print(r)
9. \S
: 匹配非空白字符
re_str9_1 = r'\S\d'
r = re.fullmatch(re_str9_1, 'w3')
print(r)
10. \D
: 匹配非数字
re_str10_1 = r'\d\D'
r = re.fullmatch(re_str10_1, '4w')
print(r)
11. \B
: 匹配非边界
re_str11_1 = r'.\BABC'
r = re.fullmatch(re_str11_1, 'wABC')
print(r)
二、正则表达式符号组合
1. [1a]
: 匹配[ ]中字符的其中一个
# [1-9]: 匹配1~9中的任何一个
# [a-z]: 匹配a~z中的任何一个
# [A-Z]: 匹配A~Z中的任何一个
# [a-zA-Z]: 匹配所有英文字母中的任何一个(不区分大小写)
re_str = r'abc[1a]'
print(re.fullmatch(re_str, 'abc1'))
print(re.fullmatch(r'[\d_]abc', '2abc'))
2. [^]
: 匹配不在[]中的任意一个字符
re_str = r'[^\d\s]ABC' # 匹配非空格非数字字符开头的ABC
print(re.fullmatch(re_str, 'rABC'))
3. *
: 匹配0次或者多次
re_str = r'\d*\w' # 匹配以数0个或者多个数字字符开头的且以一个字符,数字或下划线结束的字符串(数字字符中间不可夹杂其他类型字符)
print(re.fullmatch(re_str, '131231r'))
4. +
: 匹配一次或多次
re_str = r'\d+\w*' # 匹配出现一次或多次数字开头,接着0次或者多次字母数字下划线的字符串
print(re.fullmatch(re_str, '234jhjnwe'))
5. ?
: 匹配0次或者1次
re_str =r'[a-z]?123' # 匹配出现0次或1次小写字母开头的123结尾的字符串
print(re.fullmatch(re_str, 'z123'))
6. {N}
: 匹配N次
re_str = r'\d{5}abc'
print(re.fullmatch(re_str, '12231abc'))
7. {N,}
: 匹配大于等于N次
re_str = r'\d{3,}.*'
print(re.fullmatch(re_str, '132sdfD'))
8. {M, N}
: 匹配 M ~ N 次
re_str = r'[0-9A-Za-z]{8,16}'
print(re.fullmatch(re_str, 'luopiaopiao270l'))
9. |
: 分支
re_str = r'\d{3}|[a-z]{3}'
print(re.fullmatch(re_str, '321'))
10. ()
: 匹配的时候是分组, 让括号中的正则条件变成一个整体
re_str = r'(ABC)*'
print(re.fullmatch(re_str, 'ABCABC'))
11.* *?
:重复任意次, 但尽可能的少
re_str = r'a*?b'
print(re.match(re_str, 'aabab'))
12.* +?
: 重复一次或多次, 但尽可能少的重复
re_str = r'ba+?'
print(re.match(re_str, 'baaaba'))
补充:
正则中: .\ [] {} () * + ? ^ $ | 有特殊意义, 所以需要匹配这几个字符时需要在前面加''
注意:
1.-, [], ^, \
在中括号中可能表示特殊意义, 需要加'\'
2. ., {}, (), *, +, ?, $, |
在中括号中可以不用加''来表示字符
\(N)数字 --> : 匹配前面第N个组中的内容
re_str = r'`([1-9][a-z]{2})`\1`(\d)`\2'
print(re.fullmatch(re_str, '6fg6fg99'))
三、re模块中的方法
1. compile(正则字符串) : 将正则表达式转换成正则表达式对象
re_obj = re.compile(r'\w{6,12}')
print(re_obj.fullmatch('ewartd'))
print(re.fullmatch(r'\w{6,12}', 'ewartd'))
2. fullmatch(正则表达式, 字符串) : 完全匹配, 从头到尾匹配
match = re.fullmatch(r'\w{3}', 'qwe')
# 返回匹配对象
print(match.group())
# 获取匹配到的范围
print(match.span())
# 获取匹配结果首尾下标
print(match.start(), match.end())
# 获取被匹配的字符串
print(match.string)
# 应用: 判断一个字符串是否为某种字符串
3. match(正则表达式, 字符串) : 不完全匹配, 从头开始, 直到匹配到正则表达式对应的范围为止
# 返回匹配对象, 匹配失败返回None
match = re.match(r'\w{3}', 'QWERTY')
print(match)
print(match.group())
print(match.string)
# 应用: 判断一个字符串是否以某种字符串开头
4. search(正则表达式, 字符串) : 在指定的字符串中查找一个字符串(以正则表达式来描述),如果有多个满足条件的,只匹配第一个
# 返回值是匹配对象, 如果没有满足条件的, 则返回None
print(re.search(r'\d{2,}[a-z]', 'qew123nkjn654fd'))
# 应用: 判断一个字符串是否包含某种字符串
5. findall(正则表达式, 字符串) : 获取指定字符串中满足正则条件的 所有子串
# 返回值是列表, 列表中是符合要求的字符串, 没有满足条件的子串就返回空的列表
result = re.findall(r'\D(\d+)\D', 'Q23q饿132D434F4232D')
print(result)
# 注意 : 在通过正则表达式获取子串时,可以通过在正则表达式中添加括号来约束获取的内容,只获取()中匹配到的内容
# 匹配时按原正则表达式去查找
# 应用: 字符串提取
6. finditer(正则表达式, 字符串) : 用法和findall一样, 只是返回值不同
# 返回一个迭代器
# 括号捕获(部分)语法无效 -- 不再单独捕获括号中的内容
result = re.finditer(r'\D(\d+)\D', 'Q23q饿132D434F4232D')
print(result.__next__())
7. split(正则表达式, 字符串) : 按正则表达式匹配到的字符串进行切割
# 返回值是列表, 列表内容是被切割分段后的字符串
result = re.split(r'\d', 'Q23q饿132D434F4232D')
print(result)
8. sub(正则表达式,替换字符串, 字符串) : 在字符串中按正则表达式的子串替换成'替换字符串'
result = re.sub(r'[天线宝宝]', '*', '你好天线宝宝, 你全家都是天线宝宝')
print(result)