+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-08(82)

2019-09(116)

2019-10(2)

正则与re模块

发布于2019-09-09 12:50     阅读(637)     评论(0)     点赞(9)     收藏(3)


一、正则表达式

在线测试工具 http://tool.chinaz.com/regex/

1.字符组

  1. ​ 在同一个位置可能出现的各种字符组成一个字符组,在正则表达中用[ ]表示
  2. ​ 一个正则就是一条匹配规则,可以规定一次匹配字符的长度,字符组每次匹配一个长度为1的字符,例如:待匹配字符为:2a+ 使用字符组进行匹配时就会进行三次比较
正则 待匹配字段 匹配结果 说明
[0123456789] 5 5 在一个字符组里枚举所有合法的字符,待匹配字符与其中一个相同,即便匹配成功
[0123456789] 56 5和6 匹配个数为2 (见第二条说明)
[0-9] 7 7 用-表示范围,[0-9]和[0123456789]规则相同
[a-z] h h 匹配所有的小写字母
[a-z] 7h h 匹配个数为1
[A-Z] B B 匹配所有的大写字母
[0-9a-dA-D] 1ecD 1、c和D 匹配个数为3 (该正则可以匹配十六进制字符)

2.字符

元字符 待匹配字符 匹配个数 匹配说明
. 1$,a 4 匹配除换行符以外的任意字符
\w _1w@ 3 匹配字母数字下划线
\W _1w@ 1 匹配非字母数字下划线
\s 匹配空白(空格、换行和tab)
\S 匹配非空白
\d 匹配数字
\D 匹配非数字
\n 匹配一个换行符
\t 匹配一个制表符
\b a 2+ 4 匹配字符的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
a|b acfb 2 符合|左右其一即可
(012) 0123 1 匹配括号内的表达式(整体),与[012]区分
[^123] 28291 2 匹配非括号内的所有字符

3.量词

量词 说明
* 重复0次或多次
+ 重复1次或多次
重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次(至少n次)
{n,m} 重复n次到m次

4.转义

正则 待匹配字符 匹配 结果 说明
\n \n False 因为在正则表达式中\是有特殊意义的字符,所以要匹配\n本身,用表达式\n无法匹配
\n \n True 转义\之后变成\\,即可匹配
\\\\n \\n True 如果在python中,字符串中的'\'也需要转义,所以每一个字符串'\'又需要转义一次
r'\n' r'\n' True 在字符串之前加r,让整个字符串不转义

5.贪婪匹配

贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

正则 待匹配字符 匹配 结果 说明
<.*> <script>...<script> <script>...<script> 默认为贪婪匹配模式,会匹配尽量长的字符串
<.*?> r'\d' <script> <script> 加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串
#贪婪匹配,回溯算法
#\d+8    123456812381281766 匹配结果:12345681238128

二、re模块

python官方文档:https://docs.python.org/zh-cn/3.7/library/re.html?highlight=re#module-re

1.常用函数

1.findall()

​ 返回字符串中所有非重叠匹配项的列表。

import re
ret = re.findall('aba', 'cababa') 
print(ret) 
#结果:['aba']

ret = re.findall('a', 'cababa') 
print(ret) 
#结果:['a', 'a', 'a']
2.finditer()函数

返回一个含有所有非重叠匹配项的迭代器

ret = re.finditer('a', '1a2a3ab')  
print(ret)
r1=ret.__next__()  #r1=ret.__next__().group()
r2=ret.__next__()
print(r1)
print(r2)
#运行结果:
<callable_iterator object at 0x0370E450>
<re.Match object; span=(1, 2), match='a'>   # a
<re.Match object; span=(3, 4), match='a'> 
StopIteration


#span(起始位置,结束位置)
3.fullmatch()

​ 完全匹配。

ret = re.fullmatch('aba', 'cababa') 
print(ret)
#结果:
None

ret = re.fullmatch('aba', 'aba') 
print(ret)
#<re.Match object; span=(0, 3), match='aba'>
4.match()

​ 尝试在字符串的开头应用pattern,返回匹配对象(不可迭代),如果没有找到匹配,则为None。

ret = re.match('aba', 'cababa') 
print(ret)
#结果:
None

ret = re.match('\d', '12ab3') #相当于re.search('^\d','12ab3')
print(ret)
re1=ret.group(0)
print(re1)
#结果:
<re.Match object; span=(0, 1), match='1'>
1

​ 扫描字符串,寻找与第一个符合匹配的字符串,然后返回匹配对象(不可迭代),如果没有找到匹配,则为None。

ret = re.search('\d', 'c13ab2ab') 
print(ret)
#结果:
<re.Match object; span=(1, 4), match='aba'>
<re.Match object; span=(1, 2), match='1'>
1
#如果没有则ret为None,不可使用ret.group()
#if ret:
    ret.group
6.split(self, /, string, maxsplit=0)

​ 根据模式的出现情况拆分源字符串,返回包含结果子字符串的列表。如果捕获括号在pattern中使用,然后是all的文本模式中的组也作为结果的一部分返回列表。如果maxsplit不为零,则最多发生maxsplit拆分,字符串的其余部分作为最后一个元素返回的列表。

ret = re.split('aba', 'cababa1aba') 
print(ret) 
#结果:
['c', 'ba1', '']  

ret = re.split('aba', 'cababa1aba2') 
print(ret) 
#结果:
['c', 'ba1', '2']

ret = re.split('aba', 'cababa1aba2',maxsplit=1) 
print(ret) 
#结果:
['c', 'ba12']

ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret)  
# 结果
['', '', 'cd']
7.sub(pattern, repl, string, count=0, flags=0)

​ 返回通过pattern非重叠替换repl得到的字符串。

  • repl可以是字符串,也可以是可调用的;
  • 如果是字符串,则处理其中的反斜杠转义。
  • 如果它是一个可调用的对象,它传递了Match对象并必须返回要使用的替换字符串
ret = re.sub('\d{2}','+', '2ad232c') 
print(ret) 
#结果:
2ad+2c

import random
def fun(s):
    i = random.randint(0,len(s))
    return s[i]
ret = re.sub('\d{2}',fun('#$%'), '2ad232c') 
print(ret) 
8.subn(pattern, repl, string, count=0, flags=0)

返回通过pattern非重叠替换repl得到的字符串与替换次数组成的二元组。

  • repl可以是字符串,也可以是可调用的;
  • 如果是字符串,则处理其中的反斜杠转义。
  • 如果它是一个可调用的对象,它传递了Match对象并必须返回要使用的替换字符串
ret = re.subn('\d{2}','+', '2ad232c') 
print(ret) 
#结果:
('2ad+2c', 1)
9.compile()

将正则表达式编译成为一个 正则表达式对象,节省编译时间

obj = re.compile('\d{3}') 
ret = obj.search('abc123d') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group()) 
#结果:
123
10.template(pattern, flags=0)

​ 编译一个模板模式,返回一个模式对象

11.purge()

清除正则表达式缓存

二、分组的使用

import re
s = '<a>dfjsjgs</a>'
reg = '<a(>)(.+)<'
ret = re.search(reg,s)
print(ret.group()) #或print(ret.group(0)) 默认是0,取所有
print(ret.group(1))
print(ret.group(2))
#结果:
<a>dfjsjgs<
>
dfjsjgs


#findall(),匹配后优先返回括号内的匹配
import re
s = '1.234+4.23'
reg = '\d\.(?:\d+)'
ret = re.findall(reg,s)
print(ret)
#结果:['.234', '.23']

#取消优先  ?:
s = '1.234+4.23'
reg = '\d\.(?:\d+)'
ret = re.findall(reg,s)
print(ret)
#结果:['1.234', '4.23']


#split()
ret = re.split('\d+','abc12de34')
print(ret)
#结果:
['abc', 'de', '']
ret = re.split('(\d+)','abc12de34')
print(ret)
#结果:
['abc', '12', 'de', '34', '']


#分组命名
s = '<a>dfjsjgs</a>'
reg = '<(?P<na>\w)>\w+</a>'  #(?P<na>\w)分组命名为'na'
ret = re.search(reg,s)
print(ret.group('na'))
#结果:
a

#当要求满足正则并且相同时可以,使用分组命名
s = '<a>dfjsjgs</a>'
reg = '<(?P<na>\w)>\w+</(?P=na\w)>'
ret = re.search(reg,s)
print(ret.group('na'))
#结果:
a

s = '<a>dfjsjgs</a>'
reg = '<(?P<na>\w)>\w+</(?P=na\w)>'
ret = re.search(reg,s)
print(ret.group('na'))
#结果:
a

#分组用法示例,匹配整数
s = '1+2.4*(32-1.5)-11.11'  
reg = '\d+\.\d+|\d+'
ret = re.findall(reg,s)
print(ret)
#结果:
['1', '2.4', '32', '1.5', '11.11']
#可以对上面得到的结果进行遍历判断

s = '1+2.4*(32-1.5)-11.11'  
reg = '(\d+\.\d+)|(\d+)'
ret = re.findall(reg,s)
print(ret)
#结果:
[('', '1'), ('2.4', ''), ('', '32'), ('1.5', ''), ('11.11', '')]
#还可以利用分组进行,再次筛选
s = '1+2.4*(32-1.5)-11.11'  
reg = '\d+\.\d+|(\d+)'
ret = re.findall(reg,s)
print(ret)
#结果:
['1', '', '32', '', '']
#使用列表的remove('')

三、flags

Some of the functions in this module takes flags as optional parameters:
        A  ASCII       For string patterns, make \w, \W, \b, \B, \d, \D
                       match the corresponding ASCII character categories
                       (rather than the whole Unicode categories, which is the
                       default).
                       For bytes patterns, this flag is the only available
                       behaviour and needn't be specified.
        I  IGNORECASE  Perform case-insensitive matching.
        L  LOCALE      Make \w, \W, \b, \B, dependent on the current locale.
        M  MULTILINE   "^" matches the beginning of lines (after a newline)
                       as well as the string.
                       "$" matches the end of lines (before a newline) as well
                       as the end of the string.
        S  DOTALL      "." matches any character at all, including the newline.
        X  VERBOSE     Ignore whitespace and comments for nicer looking RE's.
        U  UNICODE     For compatibility only. Ignored for string patterns (it
                       is the default), and forbidden for bytes patterns.
    
    This module also defines an exception 'error'.
    
  re模块中的一些函数含有可选参数flags
        A           匹配相应的ASCII字符类别(而不是默认的整个Unicode)
                    对于字节模式,A是惟一可用的,不需要指定。
        I           执行不区分大小写的匹配     
        M           “^”匹配行开头(换行之后)的字符串。"$"匹配行(换行之后)的结尾字符串
        S           "."匹配所有,包括换行
 
 #re.S
s = '1Q$\n+'
ret = re.findall('.',s)
print(ret)
结果:
['1', 'Q', '$', '+']
s = '1Q$\n+'
ret = re.findall('.',s,re.S)
print(ret)
结果:
['1', 'Q', '$', '\n', '+']


#re.M
s = '123\n45 6'
ret = re.findall('^\d+',s)
print(ret)
结果:
['123']

s = '123\n45 6'
ret = re.findall('^\d+',s,re.M)
print(ret)
结果:
['123', '45']


所属网站分类: 技术文章 > python文章

作者:23dh

链接: http://www.pythonheidong.com/blog/article/104096/

来源:python黑洞网 www.pythonheidong.com

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

9 0

赞一赞 or 踩一踩

收藏该文
已收藏

评论内容:(最多支持255个字符)

相似文章

  python面试题之介绍一下Python中webbrowser的用法

  Head First Python(中文版)pdf下载

  python面试题之什么是Tkinter ?

  与孩子一起学编程sample pdf下载

  python面试题之介绍一下Python下range()函数的用法?

  The Hitchhiker’s Guide to Python pdf下载

  Python Algorithms : Mastering Basic Algorithms in the Python Language pdf下载

  贝叶斯思维:统计建模的Python学习法(Think Bayes) pdf下载

  Learn Python the Hard Way : A Very Simple Introduction to the Terrifyingly Beautiful World o pdf下载

  python游戏:doder道奇 源码下载

优质资源排行榜

 python经典电子书大合集下载 下载次数 8108

 零基础java开发工程师视频教程全套,基础+进阶+项目实战(152G) 下载次数 7545

 零基础前端开发工程师视频教程全套,基础+进阶+项目实战(共120G) 下载次数 7439

 零基础大数据全套视频400G 下载次数 7002

 零基础php开发工程师视频教程全套,基础+进阶+项目实战(80G) 下载次数 6891

 零基础软件测试全套系统教程 下载次数 6502

 全套人工智能视频+pdf 下载次数 6436

 IOS全套视频教程 基础班+就业班 下载次数 4679

 编程小白的第一本python入门书(高清版)PDF下载 下载次数 3100

10  effective python编写高质量Python代码的59个有效方法 pdf下载 下载次数 3065

11  Python深度学习 pdf下载 下载次数 3044

12  使用python+pygame开发的小游戏《嗷大喵快跑》源码下载 下载次数 2998

13  python项目开发视频 下载次数 2997

14  python从入门到精通视频(全60集)python视频教程下载 下载次数 2994

15  黑马2017年java就业班全套视频教程 下载次数 2992

16  python实战项目 平铺图像板系统源码下载,适用于想要保存,标记和共享图像,视频和网页的用户 下载次数 2987

17  利用python实现程序内存监控脚本 下载次数 2986

18  树莓派Python编程指南 pdf下载 下载次数 2979

19  老男孩python自动化视频 下载次数 2979

20  老王python基础+进阶+项目视频教程 下载次数 2972

21  尚硅谷Go学科全套视频 下载次数 2972

22  某硅谷Python项目+AI课程+核心基础视频教程 下载次数 2967

23  Web前端实战精品课程 下载次数 2966

24  Python基础教程 pdf下载 下载次数 2966

25  tron python小游戏 下载次数 2962

26  [小甲鱼]零基础入门学习Python 下载次数 2959

27  老男孩python全栈开发15期 下载次数 2958

28  2017最新web前端开发完整视频教程附源码 下载次数 2948

29  最新全套完整JAVAWEB2018开发视频 下载次数 2926

30  Python算法教程_中文版 pdf下载 下载次数 2913

31  Spring boot实战视频6套下载 下载次数 2909

32  python全套视频十五期(116G) 下载次数 2901

33  Python项目实战 下载次数 2882

34  python全自动抢火车票教程-python视频教程下载 下载次数 2882

35  30个小时搞定Python网络爬虫 含源码 下载次数 2881

36  尚硅谷大数据之Hadoop视频 下载次数 2876

37  简明python教程 (A Byte of Python)pdf下载 下载次数 2873

38  Python A~B~C~ python视频教程下载 下载次数 2864

39  数据结构与算法视频(小甲鱼讲解-全) 下载次数 2863

40  web小程序表白天数倒计时源码下载 下载次数 2862

41  Python Cookbook第三版中文PDF下载高清完整扫描原版 下载次数 2862

42  python基础视频教程 下载次数 2862

43  Python高性能编程 pdf下载 下载次数 2862

44  go语言全套视频 下载次数 2853

45  利用Python进行数据分析 pdf下载 下载次数 2850

46  清华学霸尹成Python爬虫视频-ok 下载次数 2845

47  黑马前端36期最全视频和代码 下载次数 2841

48  2018最新全套web前端视频教程+源码下载 下载次数 2840

49  老男孩Python自动化开发12期 老男孩最强一期python高级运维开发课程 第二部分 70GB 下载次数 2832

50  流畅的Python PDF下载高清完整扫描原版 下载次数 2828