Python中正则表达式

re:re是提供正则表达式匹配操作的模块

一、什么是正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某个模式匹配,Python 自1.5版本起增加了re模块,它提供Perl风格的正则表达式。

二、正则表达式的基本使用

1、re.match()介绍
match() 试图从字符串的起始位置对模式进行匹配,如果匹配成功,就返回一个匹配对象,如果匹配失败,就返回None,匹配对象的group()方法能显示成功匹配的对象。

使用语法:

re.match(pattern,string[, flags])

参数说明

  • 匹配的正则表达式,直接传入一个字符串,Python会将字符串作为正则表达式来对待
  • 匹配的字符串
  • 标志位:用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等
import re
ret = re.match("hello","hello word")
print(ret.group())  # 使用group()方式返回对应的分组
注意:
  • match() 匹配是从字符串的开始位置匹配,如果开始匹配不到则不在匹配并返回一个None
import re
ret = re.match("hello","ahello word")
print(ret.group())  # 匹配不成功,就返回None

2、re.search()介绍

  • re.match() 是从字符串的开始位置匹配,所以基本情况下能够匹配的概率不大。
  • re.search() 是从字符串中搜索正则表达式模式,任何位置都可以被匹配,返回的是第一次出现的匹配对象(因为正则字符串中可能会多出匹配),它的参数和re.match()是一样的,返回值也是一个匹配对象

使用语法:

re.search(pattern,string[,flags])
import re
ret = re.search("hello","ahello word")  # 搜索成功
print(ret.group())  # hello

3、re.match()和re.search()的区别

  • re.match匹配的时候只匹配字符串的开始,如果字符串的开始不符合正则表达式,则匹配失败,函数返回None。
  • re.search() 匹配整个字符串,直到匹配到一个。
import re
ret = re.search("^hello","ahello word")  # 如果在hello前面加^号,其search的功能和match的功能一样
print(ret.group())  # 匹配不成功,返回None

4、re.fildall()介绍

  • re.fildall() 对整个字符串从左到右进行匹配,返回所有匹配对象的列表.

使用语法:

re.fildall(pattern,string[,flags])
ret = re.fildall('\d+','hello123,word456')
print(ret)
结果:
>>>['123','456']

5、re.compile()介绍

  • re.compile() 对整个正则表达式进行预编译,生成表达式对象,用于正则匹配

使用语法:
re.compile(pattern,flags)

import re
rule = re.compile('\d+')
ret = rule.findall('hellow word456')
print(ret)
>>>456

6、re.split()介绍

  • re.split()方法与字符串的切割方法一样,返回的是一个列表,这了我用正则匹配进行切割

使用语法:
re.split(pattern,string,maxsplit,flags)

import re
strs = 'zhangsan123wangwu345we'
set = re.split('\d+',strs)
print(set)
>>>['zhangsan', 'wangwu', 'we']

7、re.sub()介绍

  • re.sub() 批量替换字符串中某个字符,如:将’hello word’替换成’HELLO word’

使用语法:
re.sub(pattern,repl,string,count)

import re
strs = 'hello word'
ret = re.sub('hello','HELLO',strs)
print(ret)
>>>HELLO word
# 使用正则来匹配替换
strs = 'abcd123efg345hi'
ret = re.sub(r'\d+','HELLO',strs)
print(ret)
>>>abcdHELLOefgHELLOhi

8、re.subn()介绍

  • re.subn的用法和re.sub是一样的,区别在与返回值,re.sub返回的是字符串,而re.subn返回的是元组

使用语法:
re.subn(pattern,repl,string,count)

import re
strs = 'abcd123efg345hi'
ret = re.subn(r'\d+','HELLO',strs)
print(ret)
>>>('abcdHELLOefgHELLOhi', 2)   #('替换后的字符串',替换的次数)
# 指定替换的次数
import re
strs = 'abcd123efg345hi'
ret = re.subn(r'\d+','HELLO',strs,1)
print(ret)
>>>('abcdHELLOefg345hi', 1)

三、正则表达式语法

  • 正则表达式的强大之处是因为它提供了很多特殊符号和字符,使用它们正则表达式才可以强大而又灵活。
字符组:
符号 描述
[0-9] 匹配数字
[a-z] 匹配小写字母
A-Z 匹配大写字母
[0-9A-z] 匹配数字及大小写字母
[3-9] 匹配小范围的数字值
[a-f] 匹配小范围的字母值
[^abc] 不匹配abc任意字符
[^a-z] 不匹配a-z直接的任意字符
1[0-9] 匹配10-19直接的数值
1[0-9][0-9] 匹配100-199直接的数值
元字符:
符号 描述
\d 匹配固定:0-9数值
\w 匹配数字字母及下划线中文:[0-9A-z_“中文”]
\s 匹配空白符:空格,Tab,回车
\t 匹配Tab
\n 匹配回车
\D 匹配数字
\W 匹配非数字字母下划线
\S 匹配非空白符
. 匹配除换行符外任意一个字符
^ 匹配以某字符开头
$ 匹配以某字符结尾
[] 字符组(只要在[]里面的都匹配)
[^] 非字符组(只要在[]里面的都不匹配)
| 或,(如:abcdef|acb)
() 分组,如:^(abcdef|abc)$
量词:
符号 描述
{n} 重复n次
{n,} 重复至少n次,n次以上
{n,m} 重复n-m次
? 0或1次
+ 1到不限
* 0到不限
贪婪和惰性:
表达式 描述
a.*b 贪婪
a.*?b,a.+?b 惰性,在量词后面的?表示惰性匹配,会在符合条件的基础上尽量少的匹配其他内容

贪婪匹配模式

  • 用到量词的匹配时,默认为贪婪模式
  • 贪婪模式的意思就是匹配的时候,尽量多匹配,不行再慢慢的减少匹配
import re
lst = "\d{2,4}"
ret = re.search(lst,"12345abcd")
print(ret.group())
结果:
>>>1234

惰性匹配模式

  • 惰性匹配模式正好和贪婪模式相对
  • 惰性匹配是尽量少的匹配,不行再慢慢去增加匹配的个数
  • 惰性匹配只需要在量词后面添加?即可
import re
lst = "\d{2,4}?"
ret = re.search(lst,"12345abcd")
print(ret.group())
结果:
>>>12
常用正则表达式
表达式 描述 结果
1[3-9]\d{9} 匹配手机号 13888998899
[1-9]\d* 匹配任意的正整数 143
\d+.\d+ 匹配任意小数 12.345
\d+(.\d+) 匹配整数或小数 12或者12.131231
常用分组
代码 描述
(exp) 匹配exp,并捕获文本到自动命名的组里
(?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写(?'name’exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给次分组分配组号
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
findall,search和分组的关系

案例1:

import re
ret = re.findall('\d(\d)','a1,b22,c345')
print(ret)
>>>[2,4]

案例2:

import re
ret = re.findall('\d(?:\d)','a1,b22,c345')
print(ret)
>>>['22','34']

案例3:

import re
ret = re.search('(?P<num1>\d)(?P<num2>\d)','a14,b22,c3357')
print(ret.group())   # 14
print(ret.group(0))  # 14
print(ret.group(1))  # 1
print(ret.group(2))  # 4
print(ret.group('num1'))  # 1
print(ret.group('num2'))  # 4

案例4:

import re
ret = re.search('(?P<num1>\d)(?P=num1)','a14,b22,c3357')
print(ret.group())  #匹配10位数,并且分组1=分组2
>>>22
分组的作用
import re
ret = re.search("<(?P<tag_name)>\w)>.*</(?P=tag_name)>","<h1>hello<\h1>")
print(ret)
print(ret.group('tag_name'))
print(ret.group())
>>>h1
>>>h1
>>><h1>hello</h1>

python中re模块及正则匹配相关推荐

  1. Python使用re模块进行正则匹配日期和时间

    Python使用re模块进行正则匹配日期和时间 目录 Python使用re模块进行正则匹配日期和时间 日期匹配 时间匹配 日期匹配 #导入需要的正则匹配的re包 # Load regex packag ...

  2. Python练习篇25-re模块利用正则匹配提取网页邮箱并保存

    本文介绍re模块利用正则匹配提取网页邮箱并保存 提取网页邮箱我们需要用到requests模块.re模块和xlwt模块(下载方法:打开cmd,输入pip install 包名),负责去匹配邮箱数据. 本 ...

  3. 【转】关于python中re模块split方法的使用

    注:最近在研究文本处理,需要用到正则切割文本,所以收索到了这篇文章,很有用,谢谢原作者. 原址:http://blog.sciencenet.cn/blog-314114-775285.html 关于 ...

  4. Python之glob模块进行文件匹配及遍历

    Python之glob模块进行文件匹配及遍历 glob是python自带的一个操作文件的相关模块,用来查找符合特定规则的文件路径,是python处理文件路径相关问题中常用的包. glob 文件名模式匹 ...

  5. Python中collections模块

    目录 Python中collections模块:模块实现了特定目标的容器,以提供Python标准内建容器 dict.list.set.tuple 的替代选择. Counter:字典的子类,提供了可哈希 ...

  6. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

  7. python中Scipy模块求取积分

    python中Scipy模块求取积分的方法: SciPy下实现求函数的积分的函数的基本使用,积分,高等数学里有大量的讲述,基本意思就是求曲线下面积之和. 其中rn可认为是偏差,一般可以忽略不计,wi可 ...

  8. python中的time库安装步骤-python中time模块需要安装么

    time是python自带的模块,用于处理时间问题,提供了一系列的操作时间的函数. time模块中时间表现的格式主要有三种:(推荐学习:Python视频教程) timestamp时间戳,是以秒表示从& ...

  9. 关于python中requests模块导入问题-python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...

最新文章

  1. 解决在AX 2009中删除公司时提示:未授权用户##删除表“DEL_PBATRANSLATECONSISTOF”中的记录...
  2. 步步高java短信恢复_步步高智能手机自带的程序不见了怎么找回
  3. 【阿里云课程】如何从零开始完成一个完整的CV项目
  4. 禁止和恢复WIN7驱动强制签名
  5. 动态规划——命运(hdu2571)
  6. Oracle truncate和delete的区别
  7. 本地提交到yarn_Flink on Yarn三部曲之三:提交Flink任务
  8. 字节输入流-InputStream demo3
  9. IOS view的圆角和阴影并存
  10. Tensorflow中训练得到Nan错误的分析
  11. 测试图片色域软件,显示器色域检测图
  12. 小米平板2Android分区表,DIY:8G+128G双系统小米平板2
  13. LM358电流检测电路
  14. 微信怎么自动加好友java_iOS逆向开发之微信自动添加好友功能
  15. 哈工大人工智能研究院院长刘劼:打造从科研到产业的创新生态
  16. MATLAB 车牌识别程序介绍 SVM、神经网络[毕业设计]
  17. JSONObject转对象
  18. 单片机蓝牙烧录_怎么样蓝牙模块给单片机烧程序?
  19. ACM DP FatMouse and Cheese
  20. 轻松建站神器!15个超精致的Bootstrap网站模板下载

热门文章

  1. 在线引入 iconfont 特殊图标字体
  2. 5.20爬虫结——Mu
  3. 如何减少PDF文件的大小
  4. 国科大学习资料--人工智能原理与算法-第一次作业解析(学长整理)
  5. 大数据与人工智能方向基础 --- 概述
  6. 软件测试这篇就够啦~
  7. 【笔记】笔记本查看电池损耗,一句命令搞定!(附笔记本电池使用技巧)
  8. Chrome谷歌浏览器插件的本地存放位置
  9. html实现360展示图片,js html5 360度全景图片预览效果
  10. Android市场-开发者账号注册等-移动开放平台网址收藏