微信公众号:运维开发故事,作者:wanger


re正则处理

正则定义

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

常用正则表达式的方法

  • re.compile(编译)

  • pattern.match(从头匹配)

  • pattern.search(匹配一个)

  • pattern.findall(匹配所有)

  • pattern.sub(替换)

特殊字符集

特殊字符 解释
. 匹配除换行符之外的任何字符
^ 匹配字符串的开头
$ 匹配字符串的结尾
* 匹配前面的字符0次或更多次,尽可能多的重复,ab*将匹配’a’,’ab’或者a后面加任意数量的b
+ 匹配前面的字符一次或更多次,ab+将匹配’ab’后加任意数量的b
? 匹配前面的字符0次或一次,ab将匹配’a’或’ab’
*?,+?,?? *,+,?都属于贪婪匹配,就是尽可能多的匹配,而有时我们希望以最少的模式匹配,可以在限定符之后加?表示以最少的方式匹配
{m} 匹配前一个字符至少m次
{m,n} 匹配前一个字符最少m次,最多n次
{m,n}? 以非贪婪模式匹配前一个字符,最少m次,最多n次,并以尽可能少的方式匹配
\ 转义字符,将\后面的字符进行转义
[] 表示一组字符,字符可以单个列出,也可以给定范围,如[abc]表示a或b或c,[a-z]表示26个小写字母中的任意一个,[^a-z]匹配非小写字母,[0-5][0-9]表示匹配00-59,特殊字符在[]也失去特殊意义,[(+ )]将匹配任何文字字符的’(‘,’)’,’+’,’
AB 匹配A或者B
() 匹配括号内的正则,每个括号都是一个组,从左往右的括号,编号依次加一
\A 匹配字符串的开头
\b 只用以匹配单词的词首和词尾(退格符)
\B 只在当前位置不在单词边界时匹配。
\d 匹配任何Unicode的十进制数字,与[0-9]相同
D 匹配任何非十进制的字符,与[^0-9]相同
\s 匹配Unicode的空白字符,匹配ascii字符集中包含空格的字符,相当于[\t\n\r\f\v]
\S 匹配不是空白字符的字符,相当于[^\t\r\n\f\v]
\w 匹配字母数字下划线,相当于[a-zA-Z0-9_]
\W 匹配非字母数字下划线,相当于[^a-zA-Z0-9]
\Z 仅匹配字符串结尾
(?P<name>) 给分组加一个别名,(?P<a>)给分组取别名为a,每个组名只能在正则表达式中定义一次
(?P=name) 引用前面别名为name的分组匹配到的任何文本
(?<=) 前向界定,表示你要匹配的字符串前面是某个字符串的时候才匹配,(‘(?<=abc)def’,’abcdef’)当def前面是abc的时候才匹配
(?=) 后向界定,表示你要匹配的字符串后面是某个字符串的时候才匹配,(‘abc(?=def)’,’abcdef’)
(?<!) 非前向界定,表示你要匹配的字符串前面不是某个字符串的时候才匹配,(‘(?<=abc)def’,’abcdef’)当def前面不是abc的时候才匹配
(?!) 非后向界定,表示你要匹配的字符串后面不是某个字符串的时候才匹配,(‘abc(?=def)’,’abcdef’)
(?(id/name)yes-pattern no-pattern)

正则表达式方法

  • re.compile(pattern,flags=0)
    编译一个正则表达式模式为正则表达式对象,其可用于使用他的匹配match(),search()以及其他方法

    >>> comp=re.compile(r'\d+')>>> ret=comp.match('123456')>>> ret.group()'123456'
    

    相当于

    ret=re.match(r'\d+','123456')
    
  • re.search(pattern,string,flags = 0)
    查找正则表达式匹配到的第一个位置,并返回相应的匹配对象

  • re.match(pattern,string,flags = 0)
    从字符串的开头匹配,并返回相应的匹配对象

  • re.fullmatch(pattern,string,flags = 0)
    将会对整个字符串进行匹配,并返回相应的匹配对象

  • re.split(pattern,string,maxsplit = 0,flags = 0)
    按照正则匹配模式进行拆分字符串,maxsplit为最多拆分次数,并且字符串的其余部分将作为列表的最后一个元素返回,如果分隔符中有捕获组并且它在字符串的开头或者结尾匹配,则结果将以空字符串开头。

    >>> re.split(r'\W+','Words words wordS')
    ['Words', 'words', 'wordS']>>> re.split(r'\W+','Words words wordS',1)
    ['Words', 'words wordS']>>> re.split(r'\d+','1q2W3e4R',flags=re.IGNORECASE)
    ['', 'q', 'W', 'e', 'R']>>> re.split(r'(\W+)', 'words, words...')
    ['words', ', ', 'words', '...', '']>>> re.split(r'\W+', 'words, words...')
    ['words', 'words', '']
    
  • re.findall(pattern,string,flags=0)
    从左往右匹配,返回一个列表,如果模式中存在一个或多个组,则返回组列表; 如果模式有多个组,这将是一个元组列表。结果中包含空匹配。

    >>> re.findall(r'\d+','123,456')
    ['123', '456']>>> re.findall(r'(\d+)(\w+)','123qw,werrc')
    [('123', 'qw')]>>> re.findall(r'(\d+)|(\w+)','123qw,werrc')
    [('123', ''), ('', 'qw'), ('', 'werrc')]
    
  • re.finditer(pattern,string,flags = 0 )
    返回一个匹配到每个结果的迭代器

    >>> for i in re.finditer(r'\d+','123456'):print(i.group())123456
    
  • re.sub(pattern,repl,string,count = 0,flags = 0 )
    将匹配到的字符串替换成repl的值,count表示要替换的模式最多替换次数,repl可以是一个字符串也可以是一个函数,当repl为字符串时,会处理其中的任何反斜杠,,可以使用\id或\g< id>、\g< name>引用分组

    >>> re.sub(r'(\d+) (\w+)',r'\2 \1','12345 asdfd')'asdfd 12345'
    

    当repl是一个函数时,那么这个函数会只接受一个匹配对象参数。例如:

>>> def mat(m):if m.group(2)=='1234':        return m.group(1)    else:        return '1234'>>> re.sub(r'(\d+) (\d+)',mat,'123 1234qer')'123qer'>>> re.sub(r'(\d+) (\d+)',mat,'123 123qer')'1234qer'
  • re.subn(pattern,repl,string,count = 0,flags = 0 )
    与sub执行的操作相同,但是返回的是元组,元组最后一个元素为替换次数

    >>> def mat(m):if m.group(2)=='1234':      return m.group(1)  else:      return '1234'>>> re.subn(r'(\d+) (\d+)',mat,'as123 1234qer')
    ('as123qer', 1)
    

    正则表达式对象

    使用re.compile可以编译一个正则表达式对象

  • regex.search(string[,pos[endpos]])
    查找正则表达式匹配到的第一个位置,并返回相应的匹配对象可选参数pos和endpos表示设置正则表达式匹配的字符串开始位置和结束位置

    >>> pattern=re.compile(r'\d+')>>> pattern.search('123456',2,5).group()
    '345'
    
  • regex.match(string,posendpos)
    如果字符串开头的零个或多个字符与此正则表达式匹配,则返回相应的匹配对象。pos和endpos用法和regex.search()意思相同

  • 编译的正则表达式的方法和属性与正则匹配的函数相同,这里不一一说明

    编译对象的常用参数

  • re.A(re.ASCII)
    使\w,\W,\b,\B,\d,\D,\s和\S只匹配ASCII字符,而不匹配Unicode字符

  • re.I(re.IGNORECASE)
    匹配时不区分大小写

  • re.L(re.LOCALE)’
    使\w \W \b \B \s \S \d \D和区分大小写的匹配只取决于当前的环境设定

  • re.M(re.MULTILINE)
    多行模式下,’^’和’$’由原来匹配字符串的开头或者结尾变成匹配每行的开头和结尾

  • re.S(re.DOTALL)
    使’.’匹配包含换行符的任何字符

  • re.X(re.VERBOSE)
    这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的

    a = re.compile(r"""\d +  # the integral part\.    # the decimal point\d *  # some fractional digits""", re.X)
    b = re.compile(r"\d+\.\d*")
    

match对象

  • match.group([ group1,… ] )
    返回匹配的一个或多个子组,如果只有一个参数,则结果为单个字符串; 如果有多个参数,则结果是一个元组,每个参数有一个项目。如果没有参数,group1默认为零(返回整个匹配)。 如果groupN参数为零,则相应的返回值是整个匹配的字符串

    >>> s=re.match(r'(\w+) (\w+)','hello world')>>> s.group(0)'hello world'>>> s.group(1)'hello'>>> s.group(2)'world'>>> s.group(1,0)
    ('hello', 'hello world')
    

    如果分组太多,我们可以对分组进行命名

    >>> m=re.match(r"(?P<first>\w+) (?P<second>\w+)",'hello world')>>> m.group('first')'hello'>>> m.group('second')'world'
    

    如果一个组匹配多次,那么最终将返回的最后一次匹配到的字符串

    >>> m=re.match(r'(\d)+','123456')>>> m.group()'123456'>>> m.group(1)'6'
    
  • match. getitem(g)
    与m.group(g)相同,这样使用会更简单

    >>> m=re.match(r'(\d)+','123456')>>> m[0]'123456'>>> m[1]'6'
    
  • match.groups(default=None)
    以元组的形式返回匹配到的所有子组,没有被匹配到的分组,默认为None,当然可以设置默认参数

    >>> m=re.match(r'(\d+),(\w+)?','1234,')>>> m.groups()
    ('1234', None)>>> m.groups('0')
    ('1234', '0')
    
  • match.groupdict(default=None)
    以字典的形式返回匹配到的值,字典的键为分组名,值为匹配到的字符串,没有匹配到的分组将设置为None

    >>> m=re.match(r'(?P<first>\d+) (?P<second>\d+)','123 456')>>> m.groupdict()
    {'first': '123', 'second': '456'}>>> m=re.match(r'(\d+) (\d+)','123 456')>>> m.groupdict()
    {}
    
  • match.start([group]) 和match.end([group])
    分别返回由分组匹配到的字符串的开始和结束的索引,结束字符串的索引为最后一个子符的索引加一group默认为零,将会表示所有匹配到的字符串

    >>> m=re.match(r'(\w+) (\w+) (\w+) (\w+)','my name is wanger')>>> m.start(2)
    3>>> m.end(2)
    7>>> m.end()
    17>>> m.start()
    0
    
  • match.span[group]
    返回一个二元组,元组的元素为分组匹配到的字符串开始的索引和结束的索引,group默认为0,表示匹配到的所有字符串

    >>> m=re.match(r'(\w+) (\w+) (\w+) (\w+)','my name is wanger')>>> m.span(2)
    (3, 7)>>> m.span()
    (0, 17)
    
  • match.pos 和match.endpos
    分别返回要匹配字符串的开始搜索的索引和结束搜索的索引

    >>> m=re.match(r'(\w+) (\w+) ','my name is wanger')>>> m.pos
    0>>> m.endpos
    17
    
  • match.lastindex
    最后匹配到的分组的索引

    >>> m=re.match(r'(\w+) (\w+) ','my name is wanger')>>> m.lastindex
    2>>> m=re.match(r'(\w+) (\w+) (\w+)','my name is wanger')
    >>> m.lastindex
    3
    
  • match.lastgroup
    最后匹配到的分组的名称,没有命名组则返回空

    >>> m=re.match(r'(\w+) (?P<last>\w+) ','my name is wanger')
    >>> m.lastgroup
    'last'
    

几个简单的实例

  1. 匹配前面是数字123的字符
>>> re.search(r'(?<=123)\w+','123asd,wer').group(0)
'asd'

2.匹配前面是数字后面是下划线的字符

>>> re.search(r'(?<=123)\w+(?=_)','123asd_123wer').group(0)
'asd'

3.匹配手机号码

>>> re.match(r'1[3,5,7,8]\d{9}|','13573528479').group()
'13573528479'

4.匹配电话号码

>>> re.match(r'\d{3}-\d{8}|\d{4}-\d{7}','0531-82866666').group()      '0531-8286666'

5.匹配IP地址

>>> re.match(r'\d+\.\d+\.\d+\.\d+','192.168.10.25').group()
'192.168.10.25'

6.匹配网易邮箱

>>> re.findall(r'\w+@163\.com|\w+@126\.com','wanger@163.com wanger@126.com')['wanger@163.com', 'wanger@126.com']

7.匹配HTML文本

>>> re.match(r'<(\w*)><(\w*)>.*</\2></\1>','<body><h2>wahaha5354</h2></body>').group()'<body><h2>wahaha5354</h2></body>'

Python正则re模块学习笔记相关推荐

  1. python zipfile_python zipfile模块学习笔记(一)

    ZIP文件格式是一种常见的存档和压缩标准,这个zipfile模块提供了工具来创建.读取.写入.附加和列出一个ZIP文件.使用ZIP64扩展(即压缩文件大小超过4G),它能解压加密的ZIP文件,解密过程 ...

  2. python模块学习笔记

    python模块学习笔记 1.Python自动发送邮件smtplib 2.制作二维码图片MyQR 3.绝对值模块math 4.CSV模块 5.openpyxl 模块,操作Excel文件 ExcelMa ...

  3. Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)

    全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...

  4. Python第三方库pygame学习笔记(一)

    Pygame Python最经典的2D游戏开发第三方库,也支持3D游戏开发 Pygame适合用于游戏逻辑验证.游戏入门及系统演示验证 Pygame是一种游戏开发引擎,基本逻辑具有参考价值 pygame ...

  5. Python快速编程入门#学习笔记03# |第二章 :Python基础(代码格式、标识符关键字、变量和数据类型、数字类型以及运算符)

    全文目录 ==先导知识== 学习目标: 2.1 代码格式 2.1.1 注释 2.1.2 缩进 2.1.3 语句换行 2.2 标识符和关键字 2.2.1 标识符 2.2.2 关键字 2.3 变量和数据类 ...

  6. 36篇博文带你学完opencv :python+opencv进阶版学习笔记目录

    基础版学习笔记传送门 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版) 进阶版笔记 项目 opencv进阶学习笔记1: 调用摄像头用法大全(打开摄像头,打开摄像 ...

  7. Python中索引的学习笔记

    1 前言 今天在学习FaceBoxes- 看到一个比较奇怪的代码,"order = scores.argsort()[::-1][:args.top_k]",不太懂这个" ...

  8. python中confIgparser模块学习

    python中configparser模块学习 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...

  9. Python地理做图——学习笔记

    Python地理做图--学习笔记 GMT 绘制海岸线 绘制地形并叠加海岸线 地理信息数据格式在线转换网址 适用OSGEO4w可以实现tif转nc,转grd 绘制grd和nc 除了投影方式-X, gmt ...

最新文章

  1. 全国大学生智能车竞赛组委会秘书处与Mathworks初步讨论竞赛合作事宜
  2. CSP认证201512-2 消除类游戏[C++题解]:模拟
  3. Vscode Python输出窗口中文乱码的解决办法
  4. C语言将正整数转换为字符串(附完整源码)
  5. java web 嵌套播放器_请教一下tableau如何嵌套进自己开发的javaweb 项目中,谢谢了...
  6. __invoke,try{}catch(){},microtime(),is_callable()
  7. 法斗几个月长鼻筋_路医生说丨脚底板早起一下地特别疼?得了足底筋膜炎,该怎么办?...
  8. oracle12密码大小写,oracle 11g 设置用户密码大小写敏感测试
  9. 对anagrams分组 Group Anagrams
  10. 【SQL】Mysql常用sql语句记录
  11. 联合促经济 伟库网在江门普及SaaS
  12. 学生成绩管理信息系统
  13. hcna华为认证网络工程师
  14. python企业文档管理系统django
  15. 智慧消防智能化管理系统综合分析
  16. 【论文笔记】Contextual Diversity for Active Learning(ECCV2020)
  17. u3d occlusion 遮挡剔除
  18. 防关联软件技术分析之跨境电商防关联云服务器之超级VPS管理器
  19. 大数据发展趋势之我见
  20. android测试内存的软件下载,华为p10内存测试软件(androbench) v5.0.1 免费版

热门文章

  1. Linux输入法平台
  2. JMeter脚本的Beanshell和JSR223和Java原生请求的对比
  3. java设计模式之策略模式+工厂模式(优化if-else)
  4. Nxlog——日志采集神器简介
  5. 3Dmax合并不同模型的UV和贴图
  6. android 获取网络视频资源,Android 加载网络视频(url地址)第三方框架简用
  7. C语言最大公约数和最小公倍数(辗转相除法)
  8. 嵌入式学习真的这么烧钱吗?
  9. 四路抢答器的控制程序设计
  10. 尚硅谷JavaScript教程笔记