一、re.compile 函数
作用:compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
案例:如何判断是正规的手机号
phone=\'\'\' weref234 16888888888 as13423423 weq 435435 15812312312e afa15812312316 13111111111 \'\'\' pattern=re.compile(r\'1[3-9]\\d{9}\') #todo 编译正则表达式之后得到一个编译对象 result=pattern.search(phone) #todo search只会返回第一个匹配的结果,如果没有匹配成功返回None print(result) #todo <re.Match object; span=(10, 21), match=\'15812312312\'>
打印结果:
<re.Match object; span=(10, 21), match=‘16888888888’>
16888888888
(10, 21)
🔥🔥🔥特别注意
1、result=pattern.search(phone):search匹配成功返回的是Match对象;search只会返回第一个匹配的结果,如果没有匹配成功则返回None
result.group():返回第一个匹配结果
result.span():返回第一个匹配结果的下标,为什么是(10,21)呐?
weref234:从0开始,4结束后还包含了换行符’/n’2个字符,所以从10开始,不包含21,前闭后开的原则
2、result=pattern.search(phone):search匹配成功返回的是Match对象;search只会返回第一个匹配的结果,如果没有匹配成功则返回None
phone=\'\'\' weref234 16888888888 as13423423 weq 435435 15812312312e afa15812312316 13111111111 \'\'\' pattern=re.compile(r\'1[3-9]\\d{9}\') #todo 编译正则表达式之后得到一个编译对象 result2=pattern.match(phone) print(result2)
打印结果为None,因为第一个字符为w开头,所以匹配不到
phone1=\"17812312345aaa\" pattern=re.compile(r\'1[3-9]\\d{9}\') #todo 编译正则表达式之后得到一个编译对象 result2=pattern.match(phone1) #todo match函数是从第一个字符开始匹配(从w开始匹配),如果第一个字符不匹配,则返回None print(result2) print(result2.group()) #todo 返回第一个匹配结果 print(result2.span()) #todo 返回第一个匹配结果的下标
打印结果:
<re.Match object; span=(0, 11), match=‘17812312345’>
17812312345
(0, 11)
二、正则表达式
表示字符
.:匹配任意单个字符(不包括换行符)
[]:匹配字符集,区间中的集合,可匹配其中任意一个字符
\\d:匹配数字,即0-9,可以表示为[0-9]、
\\s:匹配空白字符,即空格
\\S:匹配非空白字符,
\\w:匹配单词字符,即a-z、A-Z、0-9、_
\\W:匹配非单词字符
import re #.匹配任意单个字符(不包括换行符) one=\'123a\' res=re.match(\'.\',one) print(res.group()) #[]:匹配字符集,区间中的集合,可匹配其中任意一个字符 two=\'8\' res1=re.match(\'[0-9]\',two) #匹配1-9之间的数字 print(res1.group()) res2=re.match(\'[0,1,8,9]\',two) #匹配0、1、8、9之间的数字 print(res2.group()) two_2=\'Hello Python\' print(re.match(\'[hH]\',two_2).group()) #匹配小写或大写H #\\d:匹配数字,即0-9,可以表示为[0-9] three=\'天空1号发射成功\' print(re.match(\'天空\\d\',three).group()) print(re.search(\'\\d\',three).group()) 欢迎加入Python学习交流群:748989764
表示数字
*:匹配前一个字符出现0次或者无限次,即可有可无
+:匹配前一个字符出现1次或者无限次,即至少有1次
?:匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m}:匹配前一个字符出现m次
{m,}:匹配前一个字符至少出现m次
{m,n}:匹配前一个字符出现从m到n次
需求1:匹配一个字符串第一个字母是大写,后面的字母必须是小写或者没有
print(re.match(\'[A-Z][a-z]*\',\'Mn\').group()) print(re.match(\'[A-Z][a-z]*\',\'Msdfsg\').group()) print(re.match(\'[A-Z][a-z][a-z]\',\'Msdfs\').group())
Mn
Msdfsg
Msd
需求2 匹配一个变量名,
print(re.match(r\'[a-zA-Z_]+[\\w]*\',\'name1\').group()) print(re.match(r\'[a-zA-Z_]+[\\w]*\',\'_name1\').group()) print(re.match(r\'[a-zA-Z_]+[\\w]*\',\'2_name1\'))
name1
_name1
None
需求3:匹配0-99之间的任意一个数字
print(re.match(\'[0-9]?[0-9]\',\'88\').group()) print(re.match(\'[0-9]?[0-9]\',\'8\').group()) print(re.match(\'[0-9]?[0-9]\',\'08\').group()) print(re.match(\'[0-9]?[0-9]\',\'888\').group())
88
8
08
88
需求4:匹配密码(8-20位,可以是大小写的字母、数字、下划线)
print(re.match(\'[a-zA-Z0-9_]{8,20}\',\'12345678\').group()) print(re.match(\'[a-zA-Z0-9_]{8}\',\'12345678\').group())
12345678
12345678
匹配边界
^:表示以什么开头
$:表示以什么结尾
\\b:表示匹配单词的边界
|:或者
需求5:匹配163的邮箱地址,邮箱的用户名包含6~18个字符,可以是数字、字母、下划线、但是必须以字母开头,.com结尾
emails=\'\'\' awhaldc@163.com asdasdfddasdfascvdfgbdfgdsds@163.com afa_@163.com awhaldc666@163.comax q112dsdasdas@163.com aaaa_____@qq.com aaaa____@qq.com \'\'\' print(re.search(\'^[a-zA-Z][\\w]{5,17}@163\\.com$\',emails,re.MULTILINE).group())
q112dsdasdas@163.com
需求6:匹配单词的边界
print(re.search(r\'.*\\bbeijing\\b\',\'I Love beijing too\')) print(re.search(r\'.*\\bbeijing\\b\',\'I Love beijing1 too\')) print(re.search(r\'.*beijing\',\'I Love beijing too\'))
I Love beijing
None
I Love beijing
三、re模块的高级用法
re.findall(pattern,string)
1、findall:pattern在string里所有的非重复匹配,返回一个迭代器iterator保存了匹配对象
需求7:匹配所有符合以下条件的邮箱
163的邮箱地址,
邮箱的用户名包含6~18个字符,
可以是数字、字母、下划线、
但是必须以字母开头,
.com结尾
import re emails=\'\'\' awhaldc@163.com asdasdfddasdfascvdfgbdfgdsds@163.com afa_@163.com 112dsdasdas@163.com aaaa_____@126.com aaaa____@163.com \'\'\' #findall:pattern在string里所有的非重复匹配,返回一个迭代器iterator保存了匹配对象 list=re.findall(r\'(^[a-zA-Z][\\w]{5,17}@(163|126).com$)\',emails,re.MULTILINE) print(list) for email in list: print(email[0])
[(‘awhaldc@163.com’, ‘163’), (‘aaaa_____@126.com’, ‘126’), (‘aaaa____@163.com’, ‘163’)]
awhaldc@163.com
aaaa_____@126.com
aaaa____@163.com
2、sub:将匹配到的字符串,再次进行操作
需求8:匹配一个数字,把匹配的数字进行家1,返回
def add(result): #result是一个匹配对象 str_num=result.group() num=int(str_num)+1 return str(num) print(re.sub(r\'\\d+\',add,\'a=111\'))
a=112
3、split:切割匹配成功的字符串
line=\'hello,world,china.\' print(re.split(r\'\\W+\',line))
[‘hello’, ‘world’, ‘china’, ‘’]
需求9:以冒号或者空格,切割字符串
print(re.split(r\':| \',\'info:kobe 18 beijing\'))
[‘info’, ‘kobe’, ‘18’, ‘beijing’]
四、贪婪和非贪婪模式
什么是贪婪模式?
python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符
什么是非贪婪模式?
与贪婪模式相反,总是尝试匹配尽可能少的字符,可以使用、?、+、{m,n}加上?,使贪婪模式变为非贪婪模式*
需求9:非贪婪模式,需求:把电话和电话的描述信息尽可能的分开,只能用正则表达式
line2=\'this is my phone:188-1111-6666\' #非贪婪模式,需求:把电话和电话的描述信息尽可能的分开,只能用正则表达式 result=re.match(r\'(.+?)(\\d+-\\d+-\\d+)\',line2) print(result.group(1)) print(result.group(2))
来源:https://www.cnblogs.com/liuliumei/p/16784315.html
本站部分图文来源于网络,如有侵权请联系删除。