python中正则匹配之re模块
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模块的更多相关文章
- Python中正则匹配使用findall时的注意事项
在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串 "123@qq.comaaa@163.combbb@126.comasdf111@a ...
- Python中正则匹配使用findall,捕获分组(xxx)和非捕获分组(?:xxx)的差异
转自:https://blog.csdn.net/qq_42739440/article/details/81117919 下面是我在用findall匹配字符串时遇到的一个坑,分享出来供大家跳坑. 例 ...
- Python中操作mysql的pymysql模块详解
Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...
- python中的计时器:timeit模块
python中的计时器:timeit模块 (1) timeit - 通常在一段程序的前后都用上time.time()然后进行相减就可以得到一段程序的运行时间,不过python提供了更强大的计时库:ti ...
- python - 手机号正则匹配
Python 手机号正则匹配 # -*- coding:utf-8 -*- import re def is_phone(phone): phone_pat = re.compile('^(13\d| ...
- Python中正则模块re.compile、re.match及re.search函数用法
import rehelp(re.compile)'''输出结果为:Help on function compile in module re: compile(pattern, flags=0) C ...
- python - re正则匹配模块
re模块 re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对象拥有一系列方法用于正则表达式匹配和替换. re ...
- python中的正则表达式(re模块)
一.简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎 ...
- [转]python中的正则表达式(re模块)
转自:https://www.cnblogs.com/tina-python/p/5508402.html 一.简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成 ...
随机推荐
- Struts1.3——文件上传和下载
1.Struts文件上传 在Web开发中,会经常涉及到文件的上传和下载,比如在注册账户的时候,我们需要上传自己的头像等. 我们可以利用Struts很方便地实现文件的上传. 1.1 开发步骤 现在,假设 ...
- 《Hadoop学习之路》学习实践二——配置idea远程调试hadoop
背景:在上篇文章中按照大神“扎心了老铁”的博客,在服务器上搭建了hadoop的伪分布式环境.大神的博客上是使用eclipse来调试,但是我入门以来一直用的是idea,eclipse已经不习惯,于是便摸 ...
- Spring Cloud注册中心高可用搭建
Spring Cloud的注册中心可以由Eureka.Consul.Zookeeper.ETCD等来实现,这里推荐使用Spring Cloud Eureka来实现注册中心,它基于Netfilix的Eu ...
- 高级UI晋升之自定义View实战(六)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从Android 自定义属性动画&Camera动画来介绍自定义V ...
- Emacs25.1之后UrlHttpError
Emacs25.1之后UrlHttpError */--> pre.src {background-color: #002b36; color: #839496;} pre.src {backg ...
- 算法竞赛模板 AC自动机
AC自动机基本操作 (1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针. (2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思 ...
- 案例:原型 constructor
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 2018-2-13-win10-UWP-等级控件
title author date CreateTime categories win10 UWP 等级控件 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17: ...
- 安装python及编辑工具PyCharm
win10下安装python环境,安装编辑工具PyCharm 1.安装 pythonpython安装包下载地址https://www.python.org/ftp/python/3.8.0/pytho ...
- React Native 安卓模拟器调出Dev Setting
Android Studio 模拟器调出Dev Setting 实现热更新 cmd进入项目目录 F:\study\AwesomeProject> 执行 adb shell input keyev ...