作者:python来源:SegmentFault 思否社区


正则表达式用来处理字符串,对字符串进行检索和替换,另外正则在python爬虫的应用也是相当广泛! 特点

  • 灵活性、逻辑性和功能性非常强
  • 可以迅速地用极简单的方式达到字符串的复杂控制

正则语法

`# 1、数字和字母都表示它本身, . 表示匹配除了换行以外的任意字符,    . 表示匹配 .# 2、很多字母前面添加  会有特殊含义    - n:换行    - t:制表符    - d: 匹配数字,等价[0-9]    - D:非数字,等价于[^0-9]    - w:表示数字、字母以及下划线,中文,等价于[0-9a-zA-Z_]    - W:表示w取反    - s:表示任意的非打印字符(空格、换行、制表符)    - S:表示非空白字符# 3、绝大多数标点都有特殊含义    - ():用来表示一个分组,如果需要表示括号,需要使用     - []: 匹配范围,[0-9] 表示0~9范围中的一个,[0-9a-zA-Z]    - |: 表示或者的意思 re.search(r'f(x|y|z)m','pdsfxm')   匹配fxm    - {},{2,},{,3},{1,3}:用来限定前面元素出现的次数  re.search(r'go{2}d','good')    - *: 表示前面的元素出现的次数为0次及以上,等价于{0,}    - +: 表示前面的元素出现的次数为1次及以上,等价于{1,}    - ^:以指定的内容开头,或者取反的意思    - $:以指定的内容结尾# 4、 ? 的两种用法    - 规定前面元素出现的次数最多只能出现1次,等价于{,1}    - 将贪婪模式转换为非贪婪模式(重点)` 

re模块的介绍

XM返佣 https://www.fx61.com/brokerlist/xm.html该模块是python中专门用于处理正则的默认,提供了相关的方法

常用方法

  • match、search 只查询一次

  • finditer 查找到所有的匹配数据放到一个可迭代对象中

  • findall 把查找到的所有字符串结果放到一个列表中

  • fullmatch 完全匹配,字符串需要满足正则表达式

Match类的使用

调用re.match,re.search或者对re.finditer的遍历返回的对象都是re.Match对象

Match类的属性和方法

  • pos、endpos 被查找字符串的起始和终端位置
  • span( ) 匹配到的下标位置(元组)
  • group 分组的概念
`import re

m = re.search(r'c.*z', 'abcdefgz')print(m.pos)  # 0print(m.endpos)  # 8print(m.span())  # (2, 8)# 使用group获取获取到匹配的字符串print(m.group()) # cdefgz

# group表示正则表达式的分组# 1、在正则表达式里使用()表示一个分组# 2、如果没有分组,默认只有一组# 3、分组的下标从0开始

# 这里有4个分组 m1 = re.search(r'(1.*)(2.*)(3.*4)', 'a1bcd2efgh3ij4k')print(m1.group())  # 默认就是第0组  1bcd2efgh3ij4print(m1.group(0))  # 第0组就是把整个正则表达式当做一个整体  1bcd2efgh3ij4print(m1.group(1))  # 1bcdprint(m1.group(2))  # 2efghprint(m1.group(3))  # 3ij4

#  groups() 将分组以元组的形式返回print(m1.groups())  # ('1bcd', '2efgh', '3ij4')

# (?P 表达式) 给分组取个名字m2 = re.search(r'(?P1.*)(?P2.*)(?P3.*4)', 'a1bcd2efgh3ij4k')print(m2.groupdict())  # {'one': '1bcd', 'two': '2efgh', 'three': '3ij4'}` 

  • compile 在re模块,可以使用re.方法调用函数,还可以调用re.compile得到一个对象
`import re

# 这两种写法没有区别m = re.search(r'm.*a', '111m22222a')print(m)  # 

m2 = re.compile(r'm.*a')result = m2.search('111m22222a')print(result) # ` 

正则修饰符

正则修饰符是对表达式进行修饰

  • re.I 使匹配对大小写不敏感
  • re.M 多行匹配,影响 ^ 和$
  • re.S 使 . 匹配包括换行在内的所有字符
`import re

# . 表示除了换行以外的任意字符x = re.search(r'm.*a', 'abcdmonxxxa')print(x)  # None

# re.S 匹配换行y = re.search(r'm.*a', 'abcdmonxxxa', re.S)  # 让 . 匹配换行print(y)

a = re.search(r'x', 'helloXyz')print(a)  # None# re.I 忽略大小写b = re.search(r'x', 'helloXyz', re.I)print(b)  # 

# re.M 让$ 匹配到换行m = re.findall(r'w+$', 'i am boyn you are girln he is man')print(m)  # ['man']n = re.findall(r'w+$', 'i am boyn you are girln he is man', re.M)print(n) # ['boy', 'girl', 'man']` 

正则替换

sub

`import re

# 把数字替换成xm = re.sub(r'd', 'x', 'hello123wor123ld')print(m)  # helloxxxworxxxld

n = re.sub(r'd+', 'x', 'hello123wor123ld')print(n) # helloxworxld

# 需求:将p中内容的数字乘2p = 'hello50good34'def test(x):    y = int(x.group(0))    y *= 2    return str(y)  # 这里只能以字符串的形式返回

print(re.sub(r'd+', test, p)) # hello100good68` 

贪婪模式与非贪婪模式

在正则表达式里,默认采用的是贪婪模式,尽可能匹配多的字符串 在贪婪模式后面添加?,可将贪婪模式转化为非贪婪模式

import re

m = re.search(r'm.*a', 'abcm123a456a')print(m)  # m123a456a,这里为什么不是m123a呢?因为这里默认使用的贪婪模式n = re.search(r'm.*?a', 'abcm123a456a')print(n)  # m123a    使用?将贪婪模式转化为非贪婪模式

# ?print(re.match(r'aa(d+)', 'aa123bb456').group(1))  # 123print(re.match(r'aa(d+?)', 'aa123bb456').group(1))  # 1print(re.match(r'aa(d+?)', 'aa123bb456').group(0))  # aa1

# 虽然说是尽可能少的匹配,但也要满足匹配呀print(re.match(r'aaa(d+)ddd', 'aaa2333ddd').group(0))  # aaa2333dddprint(re.match(r'aaa(d+?)ddd', 'aaa2333ddd').group(1))  # 2333

print(re.match(r'aaa(d+).*', 'aaa2333ddd').group(0))  # aaa2333dddprint(re.match(r'aaa(d+?).*', 'aaa2333ddd').group(1))  # 2

- END -

vb.net 正则 替换 第n个_Python中正则表达式模块详解相关推荐

  1. python中自带的模块_python中的模块详解

    概念 python中的模块是什么?简而言之,在python中,一个文件(以".py"为后缀名的文件)就叫做一个模块,每一个模块在python里都被看做是一个独立的文件.模块可以被项 ...

  2. python中socket模块常用吗_python中socket模块详解

    socket模块简介 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.socket通常被叫做"套接字",用于描述IP地址和端口,是一个通信 ...

  3. python模块讲解_python中常用模块详解一

    1.time 模块 import time s = time.localtime() # 把时间转化成格式化的时间,通过. 取得里面的年月日等 struct_time 格式 time.struct_t ...

  4. python中threading模块_python中threading模块详解

    python中threading模块详解,threading提供了一个比thread模块更高层的API来提供线程的并发性.这些线程并发运行并共享内存. 下面来看threading模块的具体用法: 一. ...

  5. js 正则中冒号代表什么_javascript中正则表达式语法详解

    好久都没有写博客了,主要是太懒了,尤其是在阳春三月,风和日丽的日子,太阳暖暖的照在身上,真想美美的睡上一觉.就导致了这篇博客拖到现在才开始动笔,javascript的正则这一块也不是什么新的东西,主要 ...

  6. python中sys模块是什么意思_python之sys模块详解

    python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...

  7. python正则findall函数的用法_python中正则表达式 re.findall 用法

    python中正则表达式 re.findall 用法 Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了r ...

  8. python 正则findall右斜杠_python中正则表达式的使用

    本文将介绍几个最常用的正则符号,以及正则表达式的应用场景. 如果说[数学表达式]刻画的是数字的内在规律,那么[正则表达式]则是用来刻画和描述字符串内在规律的表达式.记得刚接触python时学习过sli ...

  9. python queue模块_Python的queue模块详解

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

最新文章

  1. 日记 [2008年03月23日]LINUX网关后面的pptp ***客户机连接***
  2. ES cross cluster search跨集群查询
  3. 编程python用什么软件比较好-新手入门Python编程的8个实用建议
  4. 【STM32】位操作、按位与、按位或、按位异或、取反、左移、右移等基础 C 语言知识补充
  5. 《Spring实战》读书笔记--SpringMVC之forward与redirect
  6. 网易云信给您拜年啦!
  7. 威胁情报大会直击 | 企业IT部王森:腾讯企业终端安全管理最佳实践
  8. 【美文保存】nosql数据库对比以及如何巧妙利用redis来提高效率?
  9. 自定义头文件 No such file or directory
  10. 华为首批升级鸿蒙系统的手机,鸿蒙系统首批升级机型曝光!荣耀手机遗憾缺席,原因很简单...
  11. 【java学习之路】(javaWeb【后端】篇)005.会话
  12. 基于Web的在线教师备课系统
  13. 最优化方法笔记-线性规划(大M法与两阶段法)
  14. 微信点餐系统技术总结
  15. calendar控件使用 extjs_Calendar 日历控件使用
  16. 角度值计算机符号,数学角度符号_请问各种数学符号的读音比如αβγδελζηθξσφψω等等的读音_淘题吧...
  17. conda 速度慢 解决方案
  18. 博客专家申请规则变更调整
  19. 使用阿里云IoT实现远程windows远程桌面
  20. lv双肩包尺寸对照表_lv双肩包mini尺寸对照表

热门文章

  1. 一文了解5G是什么,将如何影响我们的未来
  2. 死磕Java并发:J.U.C之AQS同步状态的获取与释放
  3. java timezone 107_java - Java使用TimeZone - 堆栈内存溢出
  4. 如何判断照片是否ps
  5. vs c# release断点调试
  6. torch sigmoid练习
  7. “std::invoke”: 未找到匹配的重载函数
  8. 八大排序算法的 Python 实现
  9. 一种比较省内存的稀疏矩阵Python存储方案
  10. 网球hcc http catcher使用方法以及规则分享