前言:在实际开发中,正则表达式主要用在模式匹配(检查一个字符是否符合某种格式)和处理复杂的文本数据,例如查找,替换,分割。
定义:使用元字符(具有特殊意义的专用字符)组成的规则,提取,替换,验证指定的字符串。
在线测试:正则表达式测试
?虽然正则表达式学一次忘一次,但是还是得学,学完忘了至少还有个影响,就算你到时候要用记不起来,问ai或者去百度的时候不会那么陌生。
我们来一起敲一敲吧:
import re
# 匹配字符 每个普通字符匹配其对应的字符
print(re.findall('123', '1234512398123'))
# 匹配两侧任意的正则表达式
print(re.findall('12|45', '1234512398123'))
# 匹配除换行外的任意一个字符
print(re.findall('张.丰', "张三丰,张四丰,张五丰"))
# 匹配字符集中的任意字符
print(re.findall('[aeiou]', "How are you?"))
# 匹配除了字符集中的任意字符
print(re.findall(r'\S', "Use 007 port"))
# \w 普通字符, \W 非普通字符
# 普通字符指的是字母、数字、下划线、汉字;非普通字符指符号。
print(re.findall(r'\w', "点评3497人,人均消费104元."))
print(re.findall('\W', "点评人数3497,人均消费104元."))
# \d 数字,\D 非数字
print(re.findall('\d', "点评人数3497,人均消费104元."))
print(re.findall('\D', "点评人数3497,人均消费104元."))
# \s 空白字符,\S 非空白字符
# 空字符指空格,\r 回车,\n 换行,\t 制表符,\f 换页符
# 重复匹配 * 匹配前面的字符出现0次或多次
print(re.findall('wo*', "woooooooo~~w!"))
# + 匹配前面的字符出现一次或多次
print(re.findall('[A-Z][a-z]+', "How are you?"))
# ? 匹配前面的字符出现0次或1次
print(re.findall('-?\d+', "最高气温6摄氏度,最低气温-3摄氏度"))
# {n} 匹配前面的字符出现n次
# 匹配手机号
print(re.findall('1[34578]\d{9}', '13123456789,15123456789,18123456789,17123456789,14123456789'))
# {m,n} 匹配前面的字符出现m到n次
# 匹配qq号
print(re.findall(r'[1-9]\d{5,10}', r'1234,123456,1234567,12345678,123456789'))
# 找日期
print(re.findall(r'\d+', "今天是2022年6月11日"))
# 大写字符串
print(re.findall(r'[A-Z][a-z]+', 'How are you?'))
# ^ 匹配字符串的开始
print(re.findall(r'^\d[a-z]*', "1aa,2b,3c"))
# $ 匹配字符串的结束
print(re.findall(r'\d[a-z]*\d$', "1aa2"))
# \b 匹配单词的边界, \B 匹配单词的非边界
# 单词边界指的是单词的首尾字符与单词字符不同,非边界指的是首尾字符之外的字符。
print(re.findall(r'\b[a-z]+\b', "how are you?"))
# 特殊字符处理
# 在正则表达式元字符前加\则元字符就是去其特殊含义
# 验证数值类型(整数、小数)
print(re.findall('^\d+\.?\d*$', '3'))
# 贪婪模式(默认):匹配重复的元字符总是尽可能多的向后匹配内容。
# 非贪心模式:匹配重复的元字符总是尽可能少的向后匹配内容。
list_result = re.findall(r'<.+?>', "<张无忌,赵敏>,周芷若,<张翠山,殷素素>,小昭")
print(list_result)
# 分组 提取年月日:2022-06-1、2022-6-11、2022/08/11
print(re.findall(r'(\d+).(\d+).(\d+)', '2022-06-1,2022-6-11,2022/08/11'))
# 正向先行断言(? = 表达式)
# 至少包含一个大写字母
print(re.search(r'^(?=\w*[A-Z])\w*$', 'Tanfs'))
# 验证密码:6位,至少1个大写字母,一个下划线组成
print(re.findall(r'^(?=.*[A-Z])(?=.*_)[A-Za-z0-9_]{6,12}$', 'Tedu_1'))
# 验证时间格式
match_result = re.search(r"^\d{2}:\d{2}:\d{2}$", "18:01:02")
print(match_result)
"""
练习:书名号内保留第一个字符目标字符串:
《Python编程快速上手》,《Python编程无师自通》,《利用Python进行数据分析》
结果:《P*》,《P*》,《利*》
"""
res1 = re.sub(r'\d', '*', '2a3b')
print(res1)
res = re.sub(r'《(.).*?》', '《\g<1>*》', "《Python编程快速上手》,《Python编程无师自通》,《利用Python进行数据分析》")
print(res)
# 分组替换:可以在替换字符串中使用\g<序号>使用正则表达式中分组数据
content = """
15:46
18 36
16 20
"""
print(re.sub(r'(\d{2})[:,\s](\d{2})', '\g<1>时\g<2>分', content))
# 使用多个切割符
print(re.split('[#,]', '悟空,26#男'))
# 编译正则表达式 重复使用
pattern = re.compile(r"^\d{2}:\d{2}:\d{2}$")
# 使用
print(pattern.search("18:01:02"))