正则表达式
1.认识正则表达式
1.什么是正则表达式
正则表达式是一种可以让复杂的字符串问题变得简单的工具
正则并不是Python特有的语法(不属于Python),所有的高级语言都支持正则,正则的语法通用
不管通过正则表达式解决的是什么问题,写正则的时候都是咋子使用正则表达式描述字符串规则。2.Python的re模块
re模块时Python用来支持正则表达式的一个模块,模块中包含了所有和正则相关的函数
fullmatch(正则表达式,字符串) - 判断正则表达式好指定的自负歘是否完全匹配(判断整个字符串是否符合正则表达式所描述的规则);如果匹配成功返回匹配对象,失败返回None
2.导入re模块中的常用函数
from re import fullmatch, findall
3.符号的用法
字符 | 功能 |
---|---|
. | 匹配任意字符 |
^ | 开头、在[]中表示非 |
$ | 以某个字符结尾 |
* | 匹配任意次数个的字符 |
+ | 匹配1次或多次个的字符 |
? | 匹配0次或者1次个的字符 |
[] | 表示匹配方括号中任意的一个字符 |
{M,N} | 匹配M次到N次的字符 |
() | 表示分组 |
4.转义字符的用法
转义字符 | 功能 |
---|---|
\d | 表示一个数字类型的字符 |
\D | 表示一个非数字类型的字符 |
\s | 表示一个空白类型的字符 |
\S | 表示一个非空白类型的字符 |
\b | 表示单词边界 |
\B | 表示非单词边界 |
\w | 表示任意的字母数字字符,相当于[a-zA-Z0-9] |
\W | 表示非字母数字字符 |
5.re模块的常用函数
函数 | 功能 |
---|---|
fullmatch() | 完全匹配,匹配失败则返回None |
match() | 匹配开头字符,匹配失败返回None |
search() | 匹配第一个能够和正则符合的子串,找不到则返回None |
findakk() | 返回的是满足所有条件的子串(用列表包装) |
finditer() | 返回的是满足条件的所有子串(用迭代器包装) |
split() | 返回的是满足切割条件进行切割的子串 |
sub(正则,字符串1,字符串2) | 字符串2中满足正则的内容替换成字符串1,并返回 |
6.代码示例
# 基本用法
result = fullmatch(r'a[MN\d]b', 'aNb')
# <Match object; span=(0, 3), match='aNb'>
result1 = fullmatch(r'a[^MN\d]b', 'aBb')
# <Match object; span=(0, 3), match='aBb'>
result2 = fullmatch(r'[1-9]\d{4,11}', '1234567')
# <Match object; span=(0, 7), match='1234567'>
# 分组
result3 = fullmatch(r'([A-Z]{3}\d{2})[\u4e00-\u9fa5][A-Z]{3}', 'SDF55哈SDF')
result4 = fullmatch(r'(\d{2})([a-z])[\u4e00-\u9fa5]{2}\1\2', '55s哈哈55s')
# AttributeError: 'Match' object has no attribute 'match'
# 属性错误:'Match'对象没有属性'match'
result5 = fullmatch(r'([a-z])(\d{3})[\u4e00-\u9fa5]{2}\2', 's825哈哈825')
print(result5.span())
# (0, 9)
# 重复
message = '我今年18岁,月薪50088元,身高188,体重70公斤,8块腹肌。每年交308元的腾讯会员费。房贷每月3000元,车贷每月2288元。'
result6 = findall(r'\d+元', message)
# ['50088元', '308元', '3000元', '2288元']
# 捕获
result7 = findall(r'(\d+)元', message)
# ['50088', '308', '3000', '2288']
# 分支
result8 = findall(r'算([\u4e00-\u9fa5]|[\u4e00-\u9fa5]{2})求', '算什么求,算了,不算嘛求了')
# ['什么', '嘛']
# 转义
result9 = findall(r'\\d+\.\d+', '\d.879') # ['\\d.879']
message1 = '12sadf456,asd史蒂夫54;sdf55;5adsf;asd;5 =8 55=sf '
result10 = findall(r'\d+', message1) # ['12', '456', '54', '55', '5', '5', '8', '55']
result11 = findall(r'\d+\b', message1) # ['456', '54', '55', '5', '8', '55']
result12 = findall(r'\b\d+', message1) # ['12', '5', '5', '8', '55']
result13 = findall(r'\B\d+\B', message1) # ['2', '45', '5', '5']
# match()
result = match(r'\d{3}', '546ashfjhas')
print(result) # <re.Match object; span=(0, 3), match='546'>
# search()
result = search(r'\d{3}', 'asdf645asddd555asd')
print(result) # <re.Match object; span=(4, 7), match='645'>
# finditer()
result = finditer(r'\d{3}', 'asdf645asddd555asd')
print(list(result)) # [<re.Match object; span=(4, 7), match='645'>, <re.Match object; span=(12, 15), match='555'>]
# split()
str1 = '123JHSKkxc会计哈决胜巅峰JLSKD855JAD=='
# 将str1中的J和K作为切割点对字符串进行切割
result = split(r'J|K', str1)
print(result) # ['123', 'HS', 'kxc会计哈决胜巅峰', 'LS', 'D855', 'AD==']
# sub()
result = sub(r'\d', '+', '123JHSKkxc会计哈决胜巅峰JLSKD855JAD==')
print(result) # +++JHSKkxc会计哈决胜巅峰JLSKD+++JAD==
# group()
result = search(r'(\d{3})([A-Z]{2})', '-=2设计师234KM222哈哈宿舍239KH')
print(result.group(1)) # '234'
# (?i)
result = fullmatch(r'(?i)abc', 'ABC') # <re.Match object; span=(0, 3), match='ABC'>
print(result)
# (?s)
result =fullmatch(r'(?s)abc.123', 'abc\n123') # <re.Match object; span=(0, 7), match='abc\n123'>
print(result)