-
非正则表达式法 # 给你一串字符串,判断是否是手机号码# (非正则表达式法)def judgephone(str): if len(str) != 11: return False elif str[0] != '1': return False elif str[1:3] != '39' and str[1:3] != '31': return False for i in range(3,11): if str[i] < '0' or str[i] > '9': return False return Trueprint(judgephone('13912345678'))print(judgephone('1391234a5678'))print(judgephone('23912345678'))print(judgephone('19012345678')) out:
TrueFalseFalseFalse
-
# 正则表达式法import redef judgephone(str): reg = r'^1[3578]\d{9}$' res = re.match(reg,str) #print(res) return res# judgephone('13912345678')# judgephone('1391234a5678')# judgephone('23912345678')# judgephone('19012345678')print(judgephone('13912345678'))print(judgephone('1391234a5678'))print(judgephone('23912345678'))print(judgephone('19012345678')) out:
NoneNoneNone - 正则表达式
# re.match函数re.match函数,是re模块里的一个原型:match(pattern,string,flags=0)参数:pattern:匹配的正则表达式string: 要匹配的字符串,(在string中匹配pattern)flags: (默认是0),标志位,用于控制正则表达式的匹配方式(如用于忽略字母的大小写来达到匹配目的),flags的值如下re.I:忽略大小写 (常用)re.L:做本地化识别re.M:多行匹配,影响^和$这两个元字符 (常用)re.S:使.匹配包括换行符在内的所有字符 (常用)re.U:根据Unicode字符集解析字符,影响 \w \W \b \Bre.X:是我们以更灵活的格式理解正则表达式功能:尝试从字符串的起始位置匹配一个模式,(注意只能是从起始位置开始),如果不是起始位置,就算匹配成功,也返回None
import re
print(re.match('www','www.baidu.com'))print(re.match('www','www.baidu.com').span())print(re.match('www','ww.baidu.com'))print(re.match('www','.baidu.wwwcom'))print(re.match('www','Www.baidu.com'))print(re.match('www','Www.baidu.com',flags=re.I))print(re.match('www','www.baiduwww.com'))# 可以发现扫描整个字符串,返回从起始位置成功的匹配
out:
(0, 3)NoneNoneNone
re.search函数原型:search(pattern,string,flags=0)参数:同上re.match函数功能:扫描整个字符串,并返回第一个成功的匹配,但不一定从头开始匹配了print(re.search('Mia','I love Mia,Mia is my love')) out:
re.findall函数原型:findall(pattern,string,flags=0)参数:同上功能:扫描整个字符串,并返回列表类型的结果print(re.findall('Mia','I love Mia,Mia is my love'))print(re.findall('Mia','I love mia,Mia is my love',flags=re.I)) out:
['Mia', 'Mia']['mia', 'Mia']
# 字符串切割import restr = 'Mia ###is a nice girl'print(str.split())print(re.split(r' +',str)) out:
['Mia', '###is', 'a', 'nice', 'girl']['Mia', '###is', 'a', 'nice', 'girl']
# re.finditer函数原型:finditer(pattern,string,flags=0)参数:pattern:匹配的正则表达式string: 要匹配的字符串,(在string中匹配pattern)flags: (默认是0),标志位,用于控制正则表达式的匹配方式(如用于忽略字母的大小写来达到匹配目的),flags的值如下re.I:忽略大小写 (常用)re.L:做本地化识别re.M:多行匹配,影响^和$这两个元字符 (常用)re.S:使.匹配包括换行符在内的所有字符 (常用)re.U:根据Unicode字符集解析字符,影响 \w \W \b \Bre.X:是我们以更灵活的格式理解正则表达式功能:与findall类似,但finditer把结果返回成一个列表。扫描整个字符串,返回的是一个迭代器
str = 'Mia is a good girl!Mia is a nice girl!Mia is a beautiful girl'res = re.finditer(r'(Mia)',str)while True: try: lis = next(res) # 转化为迭代器 print(res) except StopIteration as error: break# 利用迭代器防止得到的数据过多而占用内存,它是一条一条地处理的out:
# 字符串的替换与修改 re.sub() re.subn()sub(pattern,repl,string,count=0,flags=0)subn(pattern,repl,string,count=0,flags=0)pattern: 正则表达式(把什么什么替换掉的规则)repl: 指定的用来替换的字符串string: 目标字符串count: 最多替换次数功能:在目标字符串中,以正则表达式的规则匹配字符串,再把他们替换成指定的字符串。可以指定替换的次数,如果不指定,替换所有的匹配字符串re.sub()与re.subnF()二者的区别:前者返回一个字符串,后者返回一个元素,且第一个元素是被替换的字符串,第二个元素表示被替换的次数。
str = 'Mia is a good good good girl'print(re.sub(r'(good)','nice',str))print(re.sub(r'(good)','nice',str,count=2))print(type(re.sub(r'(good)','nice',str,count=2)))print(re.subn(r'(good)','nice',str))print(type(re.subn(r'(good)','nice',str,count=2)))out:Mia is a nice nice nice girlMia is a nice nice good girl('Mia is a nice nice nice girl', 3)
## 分组概念:除了简单的判断是否匹配之外,正则表达式还有提取子串的功能。用()表示的就是提取出来的分组。str = '010-53247654'res = re.match(r'(\d{3})-(\d{8})',str)# 使用序号获取对应组的信息,group(0)则代表的是原始字符串strprint(res.group(0))print(res.group(1))print(res.group(2))# 查看匹配的各组的情况print(res.group())out:010-5324765401053247654010-53247654
str = '010-53247654'
res = re.match(r'(?P<first>\d{3})-(?P<last>\d{8})',str) # 还可起名字,只是没多大意义print(res.group('first'))out:
010
# 编译编译:当使用正则表达式时,re模块会做二件事--1:编译正则表达式,(但我们没有这个过程),如果正则表达式本身不合法,会报错2:用编译后的正则表达式去匹配对象,但我们目前没编译,而是直接使用,无法随时“拿来”使用编译就是把正则表达式变为正则对象,以便随时对对象“拿来”使用compile(pattern,flags=0)pattern: 要编译的正则表达式str = '13600000000'pat = r'^1(([3578]\d)|(47))\d{8}$'print(re.match(pat,str))# 编译成正则对象re_telephonne = re.compile(pat)print(re_telephonne.match(str))out:
# 将正则表达式编译成正则对象: 左是re模块调用 右是re对象调用re.match(pattern,string,flags=0) --> re_etc.match(string)re.search(pattern,string,flags=0) --> re_etc.search(string)re.findall(pattern,string,flags=0) --> re_etc.findall(string)re.finditer(pattern,string,flags=0) --> re_etc.finditer(string)re.split(pattern,string,maxsplit=0,flags=0) --> re_etc.split(string,maxsplit)re.sub(pattern,repl,string,count=0,flags=0) --> re_etc.sub(repl,string,count=0)re.subn(pattern,repl,string,count=0,flags=0) --> re_etc.subn(repl,string,count=0)# 例 QQ号 :6-10位re_QQ = re.compile(r'^[1-9]\d{5,9}')print(re_QQ.search('1234567890'))print(re_QQ.search('123456a890'))print(re_QQ.search('234567890'))out: