Python正则表达式re模块
正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了。
正则表达式概念
使用单个字符串来描述匹配一系列符合某个句法规则的字符串
是对字符串操作的一种逻辑公式
应用场景:处理文本和数据
正则表示是过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;否则匹配失败
字符匹配
字符 | 描述 |
---|---|
. | 匹配任意一个字符(除了\n) |
\d \D | 数字/非数字 |
\s \S | 空白/非空白字符 |
\w \W | 单词字符[a-zA-Z0-9]/非单词字符 |
\b \B | 单词边界,一个\w与\W之间的范围,顺序可逆/非单词边界 |
匹配任意一个字符
# 匹配字符串abc,.代表b >>> re.match('a.c','abc').group()'abc'
数字与非数字
# 匹配任意一数字 >>> re.match('\d','1').group()'1' # 匹配任意一个非数字 >>> re.match('\D','a').group()'a'
空白与非空白字符
# 匹配任意一个空白字符 >>> re.match("\s"," ").group()' ' # 匹配任意一个非空白字符 >>> re.match("\S","1").group()'1' >>> re.match("\S","a").group()'a'
单词字符与非单词字符
单词字符即代表[a-zA-Z0-9]
# 匹配任意一个单词字符 >>> re.match("\w","a").group()'a' >>> re.match("\w","1").group()'1' # 匹配任意一个非单词字符 >>> re.match("\W"," ").group()' '
次数匹配
字符 | 匹配 |
---|---|
* | 匹配前一个字符0次或者无限次 |
+ | 匹配前一个字符1次或者无限次 |
? | 匹配前一个字符0次或者1次 |
{m}/{m,n} | 匹配前一个字符m次或者N次 |
*?/+?/?? | 匹配模式变为贪婪模式(尽可能少匹配字符) |
介绍
字符 | 匹配 |
---|---|
prev? | 0个或1个prev |
prev* | 0个或多个prev,尽可能多地匹配 |
prev*? | 0个或多个prev,尽可能少地匹配 |
prev+ | 1个或多个prev,尽可能多地匹配 |
prev+? | 1个或多个prev,尽可能少地匹配 |
prev{m} | m个连续的prev |
prev{m,n} | m到n个连续的prev,尽可能多地匹配 |
prev{m,n}? | m到n个连续的prev,尽可能少地匹配 |
[abc] | a或b或c |
[^abc] | 非(a或b或c) |
匹配前一个字符0次或者无限次
>>> re.match('[A-Z][a-z]*','Aaa').group()'Aaa' >>> re.match('[A-Z][a-z]*','Aa').group()'Aa' >>> re.match('[A-Z][a-z]*','A').group()'A'
匹配前一个字符1次或者无限次
# 匹配前一个字符至少一次,如果一次都没有就会报错 >>> re.match('[A-Z][a-z]+','A').group()Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'NoneType' object has no attribute 'group'
>>> re.match('[A-Z][a-z]+','Aa').group()'Aa' >>> re.match('[A-Z][a-z]+','Aaaaaaa').group()'Aaaaaaa'
匹配前一个字符0次或者1次
>>> re.match('[A-Z][a-z]?','A').group()'A' # 只匹配出一个a >>> re.match('[A-Z][a-z]?','Aaaa').group()'Aa'
匹配前一个字符m次或者N次
#匹配前一个字符至少5次 >>> re.match('\w{5}','asd234').group()'asd23' # 匹配前面的字符6-10次 >>> re.match('\w{6,10}','asd234').group()'asd234' # 超过的字符就匹配不出来 >>> re.match('\w{6,10}','asd2313qeadsd4').group()'asd2313qea'
匹配模式变为贪婪模式
>>> re.match(r'[0-9][a-z]*','1bc').group()'1bc' # *?匹配0次或者多次 >>> re.match(r'[0-9][a-z]*?','1bc').group()'1' # +?匹配一次或者多次,但是只匹配了一次 >>> re.match(r'[0-9][a-z]+?','1bc').group()'1b' # ??匹配0次或者一次 >>> re.match(r'[0-9][a-z]??','1bc').group()'1'
贪婪匹配和非贪婪匹配
边界匹配
字符 | 匹配 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\A \Z | 指定的字符串必须出现在开头/结尾 |
匹配字符串开头
# 必须以指定的字符串开头,结尾必须是@163.com >>> re.match('^[\w]{4,6}@163.com$','asdasd@163.com').group()'asdasd@163.com'
匹配字符串结尾
# 必须以.me结尾 >>> re.match('[\w]{1,20}.me$','ansheng.me').group()'ansheng.me'
指定的字符串必须出现在开头/结尾
>>> re.match(r'\Awww[\w]*\me','wwwanshengme').group()'wwwanshengme'
正则表达式分组匹配
| 匹配左右任意一个表达式
>>> re.match("www|me","www").group()'www' >>> re.match("www|me","me").group()'me'
(ab) 括号中表达式作为一个分组
# 匹配163或者126的邮箱 >>> re.match(r'[\w]{4,6}@(163|126).com','asdasd@163.com').group()'asdasd@163.com' >>> re.match(r'[\w]{4,6}@(163|126).com','asdasd@126.com').group()'asdasd@126.com'
(?P
) 分组起一个别名
>>> re.search("(?P<zimu>abc)(?P<shuzi>123)","abc123").groups()('abc', '123')
引用别名为name的分组匹配字符串
>>> res.group("shuzi")'123' >>> res.group("zimu")'abc'
re模块常用的方法
re.match()
语法格式:
match(pattern, string, flags=0)
释意:
Try to apply the pattern at the start of the string, returning a match object, or None if no match was found.
实例:
# 从头开始匹配,匹配成功则返回匹配的对象 >>> re.match("abc","abc123def").group()'abc' # 从头开始匹配,如果没有匹配到对应的字符串就报错 >>> re.match("\d","abc123def").group()Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'NoneType' object has no attribute 'group'
re.search()
语法格式:
search(pattern, string, flags=0)
释意:
Scan through string looking for a match to the pattern, returning a match object, or None if no match was found.
实例:
# 匹配整个字符串,匹配到第一个的时候就返回匹配到的对象 >>> re.search("\d","abc1123def").group()'1'
re.findall()
语法格式:
findall(pattern, string, flags=0)
释意:
Return a list of all non-overlapping matches in the string.
实例:
# 匹配字符串所有的内容,把匹配到的字符串以列表的形式返回 >>> re.findall("\d","abc123def456")['1', '2', '3', '4', '5', '6']
re.split
语法格式:
split(pattern, string, maxsplit=0)
释意:
Split the source string by the occurrences of the pattern, returning a list containing the resulting substrings.
实例:
# 指定以数字进行分割,返回的是一个列表对象 >>> re.split("\d+","abc123def4+-*/56")['abc', 'def', '+-*/', ''] # 以多个字符进行分割 >>> re.split("[\d,]","a,b1c")['a', 'b', 'c']
re.sub()
语法格式:
sub(pattern, repl, string, count=0)
释意:
Return the string obtained by replacing the leftmost non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable;
if a string, backslash escapes in it are processed. If it is a callable, it’s passed the match object and must return a replacement string to be used.
实例:
# 把abc替换成def >>> re.sub("abc","def","abc123abc")'def123def' # 只替换查找到的第一个字符串 >>> re.sub("abc","def","abc123abc",count=1)'def123abc'
实例
string方法包含了一百个可打印的ASCII字符,大小写字母、数字、空格以及标点符号
>>> import string >>> printable = string.printable >>> printable'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
>>> import re # 定义的字符串 >>> source = '''I wish I may, I wish I migth... Hava a dish of fish tonight.''' # 在字符串中检索wish >>> re.findall('wish',source)['wish', 'wish'] # 对源字符串任意位置查询wish或者fish >>> re.findall('wish|fish',source)['wish', 'wish', 'fish'] # 从字符串开头开始匹配wish >>> re.findall('^wish',source) [] # 从字符串开头匹配I wish >>> re.findall('^I wish',source)['I wish'] # 从字符串结尾匹配fish >>> re.findall('fish$',source) [] # 从字符串结尾匹配fish tonight. >>> re.findall('fish tonight.$',source)['fish tonight.'] # 查询以w或f开头,后面紧跟着ish的匹配 >>> re.findall('[wf]ish',source)['wish', 'wish', 'fish'] # 查询以若干个w\s\h组合的匹配 >>> re.findall('[wsh]+',source) ['w', 'sh', 'w', 'sh', 'h', 'sh', 'sh', 'h'] # 查询以ght开头,后面紧跟着一个非数字和字母的匹配 >>> re.findall('ght\W',source)['ght.'] # 查询已以I开头,后面紧跟着wish的匹配 >>> re.findall('I (?=wish)',source)['I ', 'I '] # 最后查询以wish结尾,前面为I的匹配(I出现次数尽量少) >>> re.findall('(?<=I) wish',source)[' wish', ' wish']
匹配时不区分大小写
>>> re.match('a','Abc',re.I).group()'A'
r 源字符串,转义,如果要转义要加两个\n
>>> import re >>> pa = re.compile(r'yangwen') >>> pa.match("yangwen.me")<_sre.SRE_Match object; span=(0, 7), match='yangwen'> >>> ma = pa.match("yangwen.me") >>> ma<_sre.SRE_Match object; span=(0, 7), match='yangwen'> # 匹配到的值存到group内 >>> ma.group()'yangwen' # 返回字符串的所有位置 >>> ma.span()(0, 7) # 匹配的字符串会被放到string中 >>> ma.string'yangwen.me' # 实例放在re中 >>> ma.rere.compile('yangwen')
Python正则表达式re模块相关推荐
- python 正则表达式re 模块的使用
python 正则表达式re 模块的使用 文章目录: 一.re模块介绍 1.re模块说明 2.官方文档给出的文档 3.别人总结的成表格中的内容 二.re模块使用介绍 1.常用函数源码 1.常用的函数介 ...
- Python 正则表达式re模块的使用
Python 正则表达式re模块的使用 基本上所有的编程语言都会有正则表达式,正则表达式是用来匹配一段字符串的表达式. 在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用内置模块re. ...
- python中re模块的span,详解Python正则表达式re模块
正则是处理字符串最常用的方法,我们编码中到处可见正则的身影. 正则大同小异,python 中的正则跟其他语言相比略有差异: 1.替换字符串时,替换的字符串可以是一个函数 2.split 函数可以指定分 ...
- python正则表达式re模块之findall函数
python正则表达式re模块之findall函数 1. re.findall函数介绍 2. findall函数捕获分组 3. re.findall中正则表达式(.*?) 4. re.findall中 ...
- python正则表达式需要模块_使用Python正则表达式模块,让操作更加简单
处理文本数据的一个主要任务就是创建许多以文本为基础的特性. 人们可能想要在文本中找出特定格式的内容,比如找出存在于文本中的电子邮件,或者大型文本中的电话号码. 虽然想要实现上述功能听起来很繁琐,但是如 ...
- Python正则表达式re模块简明笔记
简介 正则表达式(regular expression)是可以匹配文本片段的模式.最简单的正则表达式就是普通字符串,可以匹配其自身.比如,正则表达式 'hello' 可以匹配字符串 'hello'. ...
- python正则表达式——re模块
参考:python文档re --- 正则表达式操作 - Python 3.10.0 文档 目录 1.整体了解 2. 语法 3. re.match 4. re.search re.match与re.se ...
- python findall函数_Ramp;Python Data Science系列:数据处理(11)Python正则表达式re模块(三)...
前言 使用正则表达式进行匹配,可以直接调用模块级函数,如match().search().findall()等,函数第一个参数是匹配的正则表达式,第二个参数则为要匹配的字符串.也可以使用re.comp ...
- Python正则表达式-re模块奇技淫巧
文章目录 正则表达式 概念 构成 re模块应用 常用正则表达式 数字 字符 其他 小结 正则表达式 概念 正则表达式作为计算机科学的一个概念,通常被用来检索.替换那些符合某个规则的文本.正则表达式是对 ...
- 【专题】Python正则表达式re模块使用
一.从一个需求出发 现在有一个Info.txt的文本信息: 姓名 地区 身局 体重 电话 况咏蜜 北京 171 48 13651054608 王心颜 上海 169 46 13813234424 马纤羽 ...
最新文章
- MindSpore循环神经网络
- Nginx 简单的cpu配置
- Java 基础 - 各项集合实现
- [改善Java代码]性能考虑,数组是首选
- 姓名和学号 c语言,急啊!!!求救了 C语言编一个链表,输出姓名和学号就好
- 慢连接攻击的原理和防范
- 分析C#中Dialog控件(转)
- Hive导入和导出数据
- maven打包所有依赖
- 什么是jquery $ jQuery对象和DOM对象 和一些选择器
- 每周个人进度总结06
- MySQL—SQL优化笔记整理
- Cartoon CG:卡通渲染(开篇)
- 基于java+ssh+mysql实现的共享自行车单车租赁|出租管理系统项目源代码
- 网站SEO优化的关键词密度怎么布局才算合理
- 删除联想硬盘OEM分区——最简单方法
- #clickid#CID#全新小程序链路CID/clickid解决方案,合规、完美防阿里封禁
- 数据库Java项目:在线租房出租房屋系统(java+springboot+maven+mysql)
- python教程111-Python多条件计数与求和
- 【VS配置】如何设置调试命令行参数
热门文章
- html5 乱码解决方案
- 【测试】软件测试计划的编写
- solr集成IKAnalyzer中文分词器
- Function:函数对象
- LOL服务器维护打排位算吗,LOL:请停止你的排位行为,这是连败前的征兆!再玩就会一直掉分...
- matlab 整数规划工具箱,Matlab中的YALMIP工具箱 混合整数规划
- 前端框架这么火,还有必要学好原生 JavaScript 吗?
- html img设置最底层,在HTML片段中设置img标签的baseUrl
- 锐度越高越好吗_德国瑞好和德国GC地暖哪个好
- python 获取cpu使用率_如何在python中获取过去10分钟的cpu使用率