2-3-07 正则表达式
使用模块
import re
1. 字符相关
1.1 '' 匹配文本中的 ''
import re
text = "你好wupeiqi,阿斯顿发wupeiqasd 阿士大夫能接受的wupeiqiff"
# wupeiqi匹配
data_list = re.findall("wupeiqi", text)
print(data_list) # ['wupeiqi', 'wupeiqi']
# 可用于计算字符串中某个字符出现的次数
1.2 [abc] 匹配a或b或c 字符。
import re
text = "你2b好wupeiqi,阿斯顿发awupeiqasd 阿士大夫a能接受的wffbbupqaceiqiff"
#[abc] a 或 b 或 c
data_list = re.findall("[abc]", text)
print(data_list) # ['b', 'a', 'a', 'a', 'b', 'b', 'c']
# q固定,a 或 b 或 c
# q[abc] : qa / qb / qc
data_list = re.findall("q[abc]", text)
print(data_list) # ['qa', 'qc']
1.3 [^abc] 匹配除了abc意外的其他字符。
import re
text = "你wffbbupceiqiff"
# [^abc] 删除a b c 并以单个字符输出
data_list = re.findall("[^abc]", text)
print(data_list) # ['你', 'w', 'f', 'f', 'u', 'p', 'e', 'i', 'q', 'i', 'f', 'f']
1.4 [a-z] 匹配a~z的任意字符( [0-9]也可以 )。
import re
text = "alexrootrootadmin"
# t[a-z] : t开头 匹配a-z的任意一个字符
data_list = re.findall("t[a-z]", text)
print(data_list) # ['tr', 'ta']
1.5 . 代指除换行符以外的任意字符。
import re
text = "alexraotrootadmin"
# . 匹配一个字符
# r.o : r 开头 + 中间任意一个字符 + o 结尾
data_list = re.findall("r.o", text)
print(data_list) # ['rao', 'roo']
# .+ 匹配多个字符,但是会根据**`贪婪匹配`** 原则:选择最后一个o,结束匹配
# r.+o :r 开头 + 中间多个字符 + o 结尾
data_list = re.findall("r.+o", text) # 贪婪匹配
print(data_list) # ['raotroo']
# .+? 匹配多个字符,只匹配第一个符合字段
# r.+?o : r开头 + 多个字符 + o 结尾的第一个符合条件
data_list = re.findall("r.+?o", text) # 非贪婪匹配
print(data_list) # ['rao']
1.6 \w 代指字母或数字或下划线(非汉字)。
import re
text = "北京武沛alex齐北 京武沛alex齐"
# 匹配多个字符,\w+
# 匹配单个字符,\w
# 武\w+x :武开头 + 字母或数字或下划线(多个)+ x 结尾
data_list = re.findall("武\w+x", text)
print(data_list) # ['武沛alex', '武沛alex']
1.7 \d 代指数字
import re
text = "root-ad32min-add3-admd1in"
# \d 一个字符
# d\d :d开头 + 一个数字
data_list = re.findall("d\d", text)
print(data_list) # ['d3', 'd3', 'd1']
# \d+ 多个数字
# d\d+ d开头的多个数字
data_list = re.findall("d\d+", text)
print(data_list) # ['d32', 'd3', 'd1']
1.8 \s 代指任意的空白符,包括空格、制表符等。
import re
text = "root admin add admin"
# a\w+\s\w+ a开头多个字符+空白的多个字符
data_list = re.findall("a\w+\s\w+", text)
print(data_list) # ['admin add']
2. 数量相关
2.1 * 重复0次或更多次
import re
text = "他是大B个,确实是个大2B。"
data_list = re.findall("大2*B", text)
print(data_list) # ['大B', '大2B']
2.2 + 重复1次或更多次
import re
text = "他是大B个,确实是个大2B,大3B,大66666B。"
data_list = re.findall("大\d+B", text)
print(data_list) # ['大2B', '大3B', '大66666B']
2.3 ? 重复0次或1次
import re
text = "他是大B个,确实是个大2B,大3B,大66666B。"
data_list = re.findall("大\d?B", text)
print(data_list) # ['大B', '大2B', '大3B']
2.4 {n} 重复n次
import re
text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
# 151312\d{5} :151312开头 + 5个数字
data_list = re.findall("151312\d{5}", text)
print(data_list) # ['15131255789']
2.5 {n,} 重复n次或更多次
import re
text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
# \d{9,} :9个或者9个以上的数字
data_list = re.findall("\d{9,}", text)
print(data_list) # ['442662578', '15131255789']
2.6 {n,m} 重复n到m次
import re
text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
# \d{10,15} :10-15个数字
data_list = re.findall("\d{10,15}", text)
print(data_list) # ['15131255789']
3. 括号(分组)
3.1 提取数据区域
import re
text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
#15131(2\d{5}) :151312开头 + 5个数字,但是返回结果只显示 :2开头+5个数字
data_list = re.findall("15131(2\d{5})", text)
print(data_list) # ['255789']
import re
text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来15131266666呀"
# 15(13)1(2\d{5}) :151312开头 + 5个数字,但是返回结果只显示 :13固定一个,2开头+5个数字,元组方式显示
data_list = re.findall("15(13)1(2\d{5})", text)
print(data_list) # [ ('13', '255789') ]
import re
text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
# (15131(2\d{5}) :151312开头 + 5个数字,但是返回结果只显示 :151312+5个数字,2开头+5个数字,元组方式显示
data_list = re.findall("(15131(2\d{5}))", text)
print(data_list) # [('15131255789', '255789')]
3.2 获取指定区域 + 或条件
使用 | 这个 表示 或
import re
text = "楼主15131root太牛15131alex逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
# 15131(2\d{5}|r\w+太) :15131固定( + 2开头 + 5个数字 或者 r + 多个字母或数字或下划线 + 太) 结尾,但是返回结果只显示 :(2开头 + 5个数字) 或者 (r + 多个字母或数字或下划线 + 太 结尾)
data_list = re.findall("15131(2\d{5}|r\w+太)", text)
print(data_list) # ['root太', '255789']
# (15131(2\d{5}|r\w+太)) :15131固定( + 2开头 + 5个数字 或者 r + 多个字母或数字或下划线 + 太) 结尾,但是返回结果只显示 :首先用整体数据,(2开头 + 5个数字) 或者 (r + 多个字母或数字或下划线 + 太 结尾),元组方式显示
data_list = re.findall("(15131(2\d{5}|r\w+太))", text)
print(data_list) # [('15131root太', 'root太'), ('15131255789', '255789')]
4. 起始和结束
要求用户输入的内容必须是指定的内容开头和结尾,比就需要用到如下两个字符。
^开始$结束
import re
text = "啊442662578@qq.com我靠"
# 查看开始是否以字母或数字或下划线开头+ 多个字符(字母或数字或下划线) + @ + 多个字母或数字或下划线字符 + . + 多个字母或数字或下划线字符结尾
email_list = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
print(email_list) # []
text = "442662578@qq.com"
email_list = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
print(email_list) # ['442662578@qq.com']
对用户输入数据格式的校验
import re
text = input("请输入邮箱:")
email = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
if not email:
print("邮箱格式错误")
else:
print(email)
5. 特殊字符
由于正则表达式中 * . \ { } ( ) 等都具有特殊的含义,所以如果想要在正则中匹配这种指定的字符,需要转义,例如:
import re
text = "我是你{5}爸爸"
data = re.findall("你\{5\}爸", text)
print(data)

浙公网安备 33010602011771号