博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式:re模块简介和深入
阅读量:5864 次
发布时间:2019-06-19

本文共 5103 字,大约阅读时间需要 17 分钟。

  • 非正则表达式法 # 给你一串字符串,判断是否是手机号码# (非正则表达式法)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:

 

转载于:https://www.cnblogs.com/passengerlee/p/10961100.html

你可能感兴趣的文章
我的友情链接
查看>>
Git安装
查看>>
pandas和matplotlib和
查看>>
nginx开启core dump文件
查看>>
怎么用pfSense为你的web服务做负载均衡
查看>>
emma的几个不足之处
查看>>
selenium-2 使用xpath定位元素
查看>>
Java工具类——UUIDUtils
查看>>
ethereum/EIPs-191 Signed Data Standard
查看>>
CCF201412-4 最优灌溉(80分)
查看>>
使用Java学习网页爬虫
查看>>
Centos 6.5 yum 安装Apache软件
查看>>
5. Linux常用命令
查看>>
转:JDK动态代理为什么必须用接口以及与CGLIB的对比
查看>>
用javaOO知识做的ATM
查看>>
Promise的前世今生和妙用技巧
查看>>
《TCP/IP详解卷1:协议》第11章 UDP:用户数据报协议-读书笔记
查看>>
神经网络编程入门
查看>>
BZOJ3670:[NOI2014]动物园(KMP)
查看>>
并发处理-线程池
查看>>