Python基础学习之正则表达式

文章目录

  • Python基础学习之正则表达式
    • 1. python 中的正则匹配步骤
    • 2. 常用的匹配模式
      • 2.1 利用括号进行分组;
      • 2.2 使用管道符(|)匹配多个分组; | 相当于或运算;但只返回第一个匹配到的值;
      • 2.3 使用问号 (?) 实现可选匹配
      • 2.4 用星号(*) 匹配零次,一次或者多次
      • 2.5 使用加号(+)匹配 一次 或者 多次;
      • 2.6 使用花括号 {} 匹配指定次数;
      • 2.7 贪心匹配 & 非贪心匹配
    • 3. Findall() 方法
    • 4. 字符匹配
      • 4.1 字符分类
      • 4.2 建立自己的字符分类
      • 4.3 插入字符和美元字符
      • 4.4 通配字符
      • 4.5 点星(.*)符号
    • 5. 第二参数 re.I
    • 6. 正则表达式命名分组

1. python 中的正则匹配步骤

  1. 用import re 导入正则表达式模块;

  2. 用re.compile() 创建一个regex对象,最好使用原始字符串;即在字符串前加r;

  3. 向regex对象的search() 中传入想查找的字符串。返回值为一个Match对象;

  4. 调用Match对象的group() 方法,返回实际匹配文本字符串;

例子:寻找电话号码

import rephoneNumRegex = re.compile(r'\d{3}-\d{3}-\d{4}')
mo = phoneNumRegex.search('My phone number is 333-333-2222.')
print('Number is :' + mo.group())    # 输出:333-333-2222

2. 常用的匹配模式

2.1 利用括号进行分组;

import rephoneNumRegex = re.compile(r'(\d{3})-(\d{3}-\d{4})')  # 使用括号,第一个括号内是第一组,第二个括号内是第二组;
mo = phoneNumRegex.search('My phone number is 333-333-2222.')
print('Number is :' + mo.group(0))   # 返回整个匹配文本;输出:Number is :333-333-2222
print('Number is :' + mo.group())  # group()中传入0,或者不传入,则返回整个匹配文本
print('Area Number is :' + mo.group(1))  # group()中传入1,返回第一个括号内的匹配值;输出:Area Number is :333
print('Phone Number is :' + mo.group(2))  # group()中传入2,返回第一个括号内的匹配值;输出:Phone Number is :333-2222
print(mo.groups())  # 使用gourps()  一次返回所有括号内的匹配结果;输出:('333', '333-2222')
areaNum, ThoneNum = mo.groups()  # 多重赋值技巧
print(areaNum, ThoneNum)   # 输出:333 333-2222phoneNumRegex = re.compile(r'(\(\d{3}\))-(\d{3}-\d{4})')  # 当匹配值中有括号时,使用 \( 和 \) 进行转义;
mo = phoneNumRegex.search('My phone number is (333)-333-2222.')
print('Number is :' + mo.group())  # 输出:Number is :(333)-333-2222

2.2 使用管道符(|)匹配多个分组; | 相当于或运算;但只返回第一个匹配到的值;

import re
HeroRegex=re.compile(r'batman|superman')   # 匹配 batman 或者 superman;
mo1=HeroRegex.search('batman and superman!')
print(mo1.group())    # 输出管道符中第一个匹配项;输出:batman
mo2=HeroRegex.search('superman and batman!')
print(mo2.group())    # 输出管道符中第一个匹配项;输出:superman

2.3 使用问号 (?) 实现可选匹配

使用 ? 表明?前面的分组是可选的,即匹配?前面的分组 零次 或者 一次,举例如下:

import re
BatRegex=re.compile(r'bat(wo)?man')
mo1=BatRegex.search('batman and batwoman')
print(mo1.group())
mo2=BatRegex.search('batwoman and batman')
print(mo2.group())

2.4 用星号(*) 匹配零次,一次或者多次

使用 * 可以匹配 * 前面的分组零次,一次或者多次,举例如下:

import re
BatRegex=re.compile(r'bat(wo)*man')
mo1=BatRegex.search('batman and batwoman')
print(mo1.group())
mo2=BatRegex.search('batwoman and batman')
print(mo2.group())
mo3=BatRegex.search('batwowowowowowoman and batman')
print(mo3.group())

2.5 使用加号(+)匹配 一次 或者 多次;

使用加号 + 匹配+前面的分组 一次或者多次,若一次都没有出现,则匹配结果为None;

import re
BatRegex=re.compile(r'bat(wo)+man')
mo1=BatRegex.search('batman and batwoman')
print(mo1.group())
mo2=BatRegex.search('batman')
print(mo2==None)   # 返回 True

2.6 使用花括号 {} 匹配指定次数;

使用花括号{}, {3}前面的分组重复3次;{3,5} 前面的分组重复 3-5次;{3,}前面的分组3到无限大次;

import re
BatRegex=re.compile(r'bat(wo){3}man')
mo1=BatRegex.search('batman and batman')
print(mo1==None)
mo2=BatRegex.search('batwowowoman')
print(mo2.group())

2.7 贪心匹配 & 非贪心匹配

当{3,5},即匹配三次,四次,五次 都可以,那么 Python会匹配尽量多的次数,例如, Batwowowowowoman, 使用 BatRegex=re.compile(r’(wo){3,5}’),那么Python会自动匹配最多的次数,即wowowowowo, 那么如何可以匹配少的次数呢;我们使用问好(?),即BatRegex=re.compile(r’(wo){3,5}?’) ,则返回wowowo;

import re
BatRegex=re.compile(r'(wo){3,5}')
mo1=BatRegex.search('batman and batwowowowowoman')
print(mo1.group())
BatRegex2=re.compile(r'(wo){3,5}?')
mo2=BatRegex2.search('batman and batwowowowowoman')
print(mo2.group())

3. Findall() 方法

Regex 的另一个方法是findall(),可以返回一组字符串,包含所有满足条件的匹配项;

正则表达式没有分组,则返回一个字符串列表;

正则表达式有分组,返回元组的列表,每个元组表示一个匹配;

import re
phoneNumRegex=re.compile(r'\d\d\d-\d\d\d\d-\d\d\d\d')
print(phoneNumRegex.findall('kai:199-1982-1222; Pi:178-1982-1223'))   #返回 ['199-1982-1222', '178-1982-1223']
phoneNumRegex2=re.compile(r'(\d\d\d)-(\d\d\d\d-\d\d\d\d)')
print(phoneNumRegex2.findall('kai:199-1982-1222; Pi:178-1982-1223'))   #返回  [('199', '1982-1222'), ('178', '1982-1223')]

4. 字符匹配

4.1 字符分类

'''
\d    表示 0-9 的任何数字\D    表示除了0-9 的任何字符\w    表示任何字母,数字或者下划线字符\w    表示除了 字母,数字 或者下划线 的字符\s    表示 空格  制表符或者换行\S    表示除 空格,制表符,换行之外的字符
'''

4.2 建立自己的字符分类

使用上述字符分类大广泛的话,可以自定义字符分类,方法是使用 [],比如要匹配元音字母,使用[aeiouAEIOU],还可以使用 [0-5] 表示0到5的数字;并且 [] 中不需要使用\来取反义; 在[]最开始使用^ ,表示除 [] 中之外的字符;例如: [^AEIOUaeiou] ; 表示除 [aeiouAEIOU] 之外的字符;

4.3 插入字符和美元字符

可以在正则表达式开始的地方使用插入符号(^),表明匹配必须发生在被查找文本开始处。类似的 正则表达式最后使用 $, 表示文本结束;

举例: r’\d+$’ 表示 从开始到结束都是数字的字符串。

import re
phoneNumRegex=re.compile(r'^\d+$')
print(phoneNumRegex.findall('1234567 345')==[]) # 无论是哪里有非数字的字符,都会返回[];
print(phoneNumRegex.findall('1234455'))

4.4 通配字符

正则表达式中,. (句号)代表通配符, 匹配除了换行外的所有字符(只匹配一个字符);使用真正的. 需要使用转义(.);
通过传入 re.DOTALL 作为re.compile() 的第二个参数,可以使. 匹配所有字符,包括换行符;

import re
noNewLineRegex=re.compile('.*')
newLineRegex=re.compile('.*',re.DOTALL)
mo=noNewLineRegex.search('So ,god bless American.\n God do not bless American.')
mo1=newLineRegex.search('So ,god bless American.\n God do not bless American.')
print("----")
print(mo.group())
print("----")
print(mo1.group())

4.5 点星(.*)符号

使用 .* 代表任意字符;

import re
nameRegex=re.compile(r'first name:(.*) last name:(.*)')
mo=nameRegex.search('first name:zhang last name: Kai')
print(mo.group())   # 返回:first name:zhang, last name: Kai

贪心模式 & 非贪心模式(使用?)

import re
nonGreedyRegex=re.compile(r'<.*?>')   # 非贪心模式
GreedyRegex=re.compile(r'<.*>')   # 贪心模式
mo=nonGreedyRegex.search('<first name:zhang> last name: Kai>')
mo2=GreedyRegex.search('<first name:zhang> last name: Kai>')
print(mo.group())   # 返回:<first name:zhang>
print(mo2.group())    #返回:<first name:zhang> last name: Kai>

5. 第二参数 re.I

RE.compile()的第二参数;

6. 正则表达式命名分组

命名方式: ?P<名称>
举例:(?P\d{4}) 匹配一个四位数字,名字为year;

Python基础学习之正则表达式(完整版)相关推荐

  1. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  2. Linux shell脚本基础学习详细介绍(完整版)

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  3. Linux shell脚本基础学习详细介绍(完整版)2

    详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...

  4. python计算机知识点,最新最全Python基础的知识点复习完整版.pdf

    1.切片操作三个参数的意义: 切片是 Python 序列的重要操作之一,适用于列表.元组.字符串. range 对象等类型. 切片使用 2 个冒号分隔的 3 个数字来完成 ,第一个数字表示切片开始位置 ...

  5. 「python自学建议贴」Python学习路线+视频教程完整版

    前言 最近有些朋友问我如何尽快入门Python,还有些是想从别的职业转行过来,但都不太了解Python开发究竟需要学什么,究竟要从哪里学起,哪些是主流的Python技术等等,导致想学,但又很迷茫,不知 ...

  6. WEB前端开发职业学习路线初级完整版

    下面小编专门为广大web前端开发职业者汇总了学习路线初级完整版,其实web前端开发工程师可算是高福利,高薪水的职业了,所以现在学习web前端开发的技术人员也是越来越多了,但是在学习web前端开发中去学 ...

  7. Python基础学习之布尔表达式

    在Python编程的学习中,布尔逻辑可以说是无处不在.布尔表达式是计算机运算的基础和重要组成部分,掌握它们就跟学音乐要掌握音阶一样有必要.今天本文将带大家一起来学习布尔表达式,主要内容有布尔表达式的概 ...

  8. python自学用什么书好-适合python基础学习的好书籍

    分享几本python基础学习的书籍给大家 <Python编程:从入门到实践> 内容简介:本书是一本针对所有层次的Python 读者而作的Python 入门书.全书分两部分:第一部分介绍用P ...

  9. 网页爬虫python代码_《用python写网络爬虫》完整版+源码

    原标题:<用python写网络爬虫>完整版+源码 <用python写网络爬虫>完整版+附书源码 本书讲解了如何使用Python来编写网络爬虫程序,内容包括网络爬虫简介,从页面中 ...

  10. Python基础学习笔记之(二)

    Python基础学习笔记之(二) zouxy09@qq.com http://blog.csdn.net/zouxy09 六.包与模块 1.模块module Python中每一个.py脚本定义一个模块 ...

最新文章

  1. CH Round #30 摆花[矩阵乘法]
  2. 的setinterval函数_Vue定时器与JS 定时器 setInterval() 和 setTimeout()
  3. 新建一个文件夹服务器,云服务器中新建文件夹命令
  4. 计算机系统维护是学什么,《计算机系统维护》教学大纲.doc
  5. netty冲突 play sbt_Scala的Play框架:编译错误[类型应用程序不是程序包控制器的成员]...
  6. C++学习随笔之一:基础
  7. 持续集成工具集之四 Jenkins+Maven+Git+Tomcat 项目构建和自动部署
  8. mysql修改表字段小数点精度_技术篇-将字段类型decimal批量处理从2位改为4位小数点sql,解决数据库存储精度...
  9. Careercup | Chapter 3
  10. html 常用button事件
  11. Spark创建临时视图
  12. 活动目录管理中常用的脚本(二)
  13. 最新席瓦莱恩服务器人口比例,2021魔兽世界怀旧服3月人口普查_最新怀旧服3月人口普查数据一览_3DM网游...
  14. (转载)3. 飞控与惯性导航系统
  15. Qt编写自定义控件54-时钟仪表盘
  16. java scavenge_Java虚拟机(JVM)垃圾回收器Parallel Scavenge收集器 - Break易站
  17. 平凡的女人,伟大的奉献
  18. C++初步之核心编程篇五:多态与虚函数类
  19. 计算机考研301数学一攻略,国家海洋技术中心
  20. 10005---海量数据排序总结

热门文章

  1. 职友集(www.jobui.com) Lucene Similarity 的排序规则更改了...
  2. CSS3nbsp;Transitionnbsp;Transformnbsp;Animat…
  3. 深度学习的应用与实践
  4. 每部都是经典 一生不能不看的电影
  5. 个人计算机与工作站 服务器有什么区别,工作站与服务器有什么区别?
  6. win7的计算机最大连接数,win7系统解除共享文件夹最大连接数限制的操作方法
  7. 你要小心那些涉世不深的老实人
  8. U盘数据恢复工具哪个好?
  9. java 获取当前月的第一天和最后一天
  10. 转载ios开发如何使用Xcode的Targets来管理开发和生产版本的构建