python 正则表达式、re
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
参考链接:https://www.runoob.com/python/python-reg-expressions.html#flags
补充:
实战
- >>> import re#匹配02.56
- >>> time_count=re.compile(r'\d+\.+\d+')#注意匹配.要加转义字符
- >>> s='time=02.56s'
- >>> result=time_count.search(s).group()
- >>> print(result)
- 02.56
- >>> result=time_count.search(s)#这样会输出
- >>>
- >>> print(result)
- <_sre.SRE_Match object; span=(5, 10), match='02.56'>
- >>> result=time_count.findall(s)#注意是list
- >>> print(result)
- ['02.56']
- >>> result=time_count.findall(s).group()
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- AttributeError: 'list' object has no attribute 'group'
第二次 ,$匹配末尾的
- import re
- #匹配02.56
- time_count=re.compile(r'\d+\.+\d+$')#$就这样放在匹配的后面
- s='time=02.56s'
- result=time_count.findall(s)
- print(result)
- #输出
- []
- #因为re$不是表示返回在字符串中到re匹配的地方结束,而是代表字符串也以re所表示的结束
- s='time=02.56'
- #这样就有了
- ['02.56']
正则表达式对象
re.RegexObject
re.compile() 返回 RegexObject 对象。有的方法是用这个对象调用的,都能
re.MatchObject
match()匹配成功返回的对象
- >>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
- >>> print m # 返回一个 Match 对象
- <_sre.SRE_Match object at 0x10a42aac0>
表达式模式:更多模式见参考链接
当匹配'.'时,需要加转移字符\即r'\.'会匹配点
模式 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
re* | 匹配0个或多个的表达式。 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
re{ n} | 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。 |
re{ n,} | 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。 |
re{ n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a| b | 匹配a或b |
(?! re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 |
\w | 匹配字母数字及下划线 |
\W | 匹配非字母数字及下划线 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f]. |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9]. |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 |
\B | 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
\n, \t, 等. | 匹配一个换行符。匹配一个制表符。等 |
\1...\9 | 匹配第n个分组的内容。 |
\10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |
方法
re.compile() 函数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
- re.compile(pattern[, flags])
- # pattern : 一个字符串形式的正则表达式
- # flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
- # re.I 忽略大小写
- # re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
- # re.M 多行模式
- # re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
- # re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
- # re.X 为了增加可读性,忽略空格和 # 后面的注释
re.match函数
re.match()函数尝试从字符串的起始位置匹配一个模式,如果在起始位置匹配成功的话,返回none,当匹配成功时返回一个 Match 对象
- re.match(pattern, string, flags=0)#pattern模式
#pattern参数可以是字符串,也可以是正则表达式- #flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
- #例:
- import re
- print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配到
- print(re.match('com', 'www.runoob.com')) # 这个就没有匹配到,因为起始位置不是com
- #输出
- (0, 3)
- None
RegexObject.match()(是RegexObject调用的)
- >>>import re
- >>> pattern = re.compile(r'\d+') # 用于匹配至少一个数字#注意时一个数字开头
- >>> m = pattern.match('one12twothree34four') # 查找头部,没有匹配
- >>> print m
- None
- >>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配
- >>> print m
- None
- >>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
- >>> print m # 返回一个 Match 对象
- <_sre.SRE_Match object at 0x10a42aac0>
- >>> m.group(0) # 可省略 0
- '12'
- >>> m.start(0) # 可省略 0
- 3
- >>> m.end(0) # 可省略 0#这是因为到’t‘处就没有匹配,就结束了
- 5
- >>> m.span(0) # 可省略 0
- (3, 5)
group([group1, …])
方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用group()
或group(0)
;start([group])
返回匹配开始的位置(子串第一个字符的索引),参数默认值为 0;end([group])
返回匹配结束的位置(子串最后一个字符的索引+1),参数默认值为 0;span([group])
返回一个元组包含匹配 (开始,结束) 的位置(start(group), end(group))
。
group()
匹配成功re.match方法返回一个匹配的对象,我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
group(num=0) | 匹配的整个表达式的字符串(就是string参数喽?),group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 |
实例:
- import re
- line = "Cats are smarter than dogs"
- matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
- print("matchObj.group() : ", matchObj.group())#返回整个字符串
- print ("matchObj.group(1) : " matchObj.group(1))#返回匹配的第一个小组
- print ("matchObj.group(2) : ", matchObj.group(2))
- #输出
- matchObj.group() : Cats are smarter than dogs
- matchObj.group(1) : Cats
- matchObj.group(2) : smarter
re.search方法
re.search 扫描整个字符串并返回第一个成功的匹配。
和match()方法的区别是:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
此外参数都一样
- re.search(pattern, string, flags=0)
匹配成功re.search方法返回一个匹配的对象,否则返回None。我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。都和match()方法一样
- import re
- print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
- print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配同样也又结果
- #结果
- (0, 3)
- (11, 14)
findall()
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
- findall(string[, pos[, endpos]])
- # string : 待匹配的字符串。
- # pos : 可选参数,指定字符串的起始位置,默认为 0。
- # endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。
实例:
- import re
- pattern = re.compile(r'\d+') # 查找数字
- result1 = pattern.findall('runoob 123 google 456')
- result2 = pattern.findall('run88oob123google456', 0, 10)
- print(result1)
- print(result2)
- #输出
- ['123', '456']
- ['88', '12']
re.finditer
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。参数和match、search相同
实例:
- import re
- it = re.finditer(r"\d+","12a32bc43jf3")
- for match in it:
- print (match.group() )
- #输出
- 12
- 32
- 43
- 3
re.sub()检索和替换
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
- re.sub(pattern, repl, string, count=0, flags=0)
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
注意,repl可以是一个函数
- import re
- # 将匹配的数字乘以 2
- def double(matched):#注意函数的定义方式,没有什么不同
- value = int(matched.group('value'))
- return str(value * 2)
- s = 'A23G4HFD567'
- print(re.sub('(?P<value>\d+)', double, s))#直接传入函数名即可
#输出结果
- A46G8HFD1134
re.split 分割
split 方法 按照能够匹配的子串 将字符串 分割后 返回列表,它的使用形式如下:
- re.split(pattern, string[, maxsplit=0, flags=0])
- # maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
实例:
- >>>import re
- >>> re.split('\W+', 'runoob, runoob, runoob.')
- ['runoob', 'runoob', 'runoob', '']
- >>> re.split('(\W+)', ' runoob, runoob, runoob.')
- ['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
- >>> re.split('\W+', ' runoob, runoob, runoob.', 1)
- ['', 'runoob, runoob, runoob.']
- >>> re.split('a*', 'hello world') # 对于一个找不到匹配的字符串而言,split 不会对其作出分割
- ['hello world']
正则表达式修饰符 - 可选标志
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
python 正则表达式、re的更多相关文章
- Python 正则表达式入门(中级篇)
Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...
- Python正则表达式中的re.S
title: Python正则表达式中的re.S date: 2014-12-21 09:55:54 categories: [Python] tags: [正则表达式,python] --- 在Py ...
- Python 正则表达式入门(初级篇)
Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...
- python正则表达式re
Python正则表达式: re 正则表达式的元字符有. ^ $ * ? { [ ] | ( ).表示任意字符[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可 ...
- Python正则表达式详解
我用双手成就你的梦想 python正则表达式 ^ 匹配开始 $ 匹配行尾 . 匹配出换行符以外的任何单个字符,使用-m选项允许其匹配换行符也是如此 [...] 匹配括号内任何当个字符(也有或的意思) ...
- 比较详细Python正则表达式操作指南(re使用)
比较详细Python正则表达式操作指南(re使用) Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 E ...
- Python正则表达式学习摘要及资料
摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...
- python正则表达式 小例几则
会用到的语法 正则字符 释义 举例 + 前面元素至少出现一次 ab+:ab.abbbb 等 * 前面元素出现0次或多次 ab*:a.ab.abb 等 ? 匹配前面的一次或0次 Ab?: A.Ab 等 ...
- Python 正则表达式-OK
Python正则表达式入门 一. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分. 正则表达式是用于处理字符串的强大工具, 拥有自己独特的语法以及一个独立的处理引擎, 效率上 ...
- Python天天美味(15) - Python正则表达式操作指南(re使用)(转)
http://www.cnblogs.com/coderzh/archive/2008/05/06/1185755.html 简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格 ...
随机推荐
- win10上安装ubunt18双系统过程中出现mmx64.efi not found问题
安装Ubuntu18过程中,从u盘启动ubunt安装,出现mmx64.efi not found问题 如下图: 制作好ubunt启动盘之后在EFI/BOOT下会看到两个文件,将其中grubx64.ef ...
- 简易解说拉格朗日对偶(Lagrange duality)(转载)
转载自https://www.cnblogs.com/90zeng/p/Lagrange_duality.html,本人觉得讲的非常好! 1.原始问题 假设是定义在上的连续可微函数(为什么要求连续可微 ...
- 【餐厅】 What kind of food would you like to eat tonight?
核心句型 What kind of food would you like to eat tonight? 你今晚想吃哪种菜? What would you like to eat ? 你想吃什么? ...
- ubuntu16.04安装docker图形管理界面portainer
下载镜像 docker pull portainer/portainer 单机版运行 docker run -d --name portainer \ -p 9000:9000 \ --restart ...
- JAVA并发-CountDownLatch
源码: 内部类Sync private static final class Sync extends AbstractQueuedSynchronizer { private static fina ...
- 线段树模板(无lazy优化)
区间修改与区间查询问题 模板: int ans; struct node{ int l,r,v; node(){v=;} }tree[LEN*]; int arr[LEN]; //建树 void bu ...
- 在.Net Core中使用HttpClient添加证书
最近公司要对接电信物联网北向API接口,当调用Auth授权接口时,需要用到证书,此篇文章记录下遇到的坑~ 有两种调用接口的方式,下面是两种方式的简单示例 1.使用HttpClient public s ...
- .NetCore 入门篇:理解
(良心转载)原文地址:https://ken.io/note/dotnet-core-qucikstart-preface 一..NET Core的诞生 聊 .NET Core,就不得不说他的爸爸 . ...
- guava(二) Equivalence & Supplier
一.Equivalence 一种判定两个实例是否相等的策略 全路径: com.google.common.base 声明: @GwtCompatible public abstract class E ...
- 框架之jQuery妙用
1.jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Ajax交 ...