Python 标准库模块 - re
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 标准库模块 - re相关的知识,希望对你有一定的参考价值。
re模块被称为正则表达式,其作用为,创建一个“规则表达式”,用于验证和查找符合规则的文本,广泛用于各种搜索引擎、账户密码的验证等。
预定义字符:
\\d:匹配所有的十进制数字0-9
\\D:匹配所有的非数字,包含下划线
\\s:匹配所有空白字符(空格、TAB等)
\\S:匹配所有非空白字符,包含下划线
\\w:匹配所有字母、汉字、数字a-z A-Z 0-9
\\W:匹配所有非字母、汉字、数字,包含下划线
特殊字符:
$:匹配一行的结尾(必须放在正则表达式最后面)
^:匹配一行的开头(必须放在正则表达式最前面)
*:前面的字符可以出现0次或多次(0~无限)
+:前面的字符可以出现1次或多次(1~无限)
?:变"贪婪模式"为"勉强模式",前面的字符可以出现0次或1次
.:匹配除了换行符"\\n"之外的任意单个字符
|:两项都进行匹配
[ ]:代表一个集合,有如下三种情况
[abc]:能匹配其中的单个字符
[a-z0-9]:能匹配指定范围的字符,可取反(在最前面加入^)
[2-9] [1-3]:能够做组合匹配
:用于标记前面的字符出现的频率,有如下情况:
n,m:代表前面字符最少出现n次,最多出现m次
n,:代表前面字符最少出现n次,最多不受限制
,m:代表前面字符最多出现n次,最少不受
n:前面的字符必须出现n次
参考技术A正则表达式引擎对正则表达式文本进行编译生成正则表达式对象,再由正则表达式对象对目标文本进行匹配,后返回匹配结果。
正则表达式中一共包含 2 中字符: 普通字符 、 元字符
匹配单个字符的元字符及其含义:
匹配重复性的元字符及其含义:
匹配位置的元字符及其含义:
分组匹配的元字符及其含义:
表示或运算的元字符:
转义元字符:
在 Python 中使用正则表达式,我们需要借助 re 模块提供的强大 API,下面我们就来学习几个 re 模块常用的接口吧~
参数说明: findall("正则表达式", "要匹配的字符串", flags=标志1|标志2|...)
返回值:以列表形式返回匹配到的字符串。
下面,我们用 findall 返回 Python 之禅中首尾用到的反义词:
运行结果:
当正则表达式中含有一个以上分组时, findall 返回的列表由元组构成,元组中包含每个分组匹配到的内容。如果只有一个分组,则返回由该分组匹配到的内容组所构成的列表:
match 函数返回的结果是一个 SRE_Match 对象:
SRE_Match 具有很多的属性,比如 .string 属性可以方便我们我获取在匹配时输入的字符串:
属性 .re 可以获取匹配时使用的编译后的正则表达式模式:
由于默认使用了 re.UNICODE ,所以我们这里的 \\w 可以匹配中文字符。
属性 .regs 则以列表的形式返回正则表达式匹配到的内容以及各个分组陪陪到的内容,不过请注意,返回的都是索引的形式:
可以使用序列切片来看一下我们的正则表达式及其中的两个分组所匹配到的内容:
SRE_Match 对象也提供了非常多好用的方法,比如 groups 可以获取各个分组匹配到的内容:
group 则可以灵活地获取正则表达式或对应分组匹配到的内容:
如果使用的正则表达式定义了分组的名称, group 还可以通过名称获取相应分组匹配的内容:
在定义了分组的名称之后,还可以方便地使用 groupdict 以字典的形式返回所有分组匹配的结果:
最后需要注意的是, match 从字符串的开头开始匹配,如果开头不符合要求,则直接返回 None 。
与 match 匹配开头不同, search 匹配第一个符合规则的字符串,未成功则返回 None 。参数: re.search(pattern, string, flags=0) ;返回值同 match 。
在介绍 match 的使用时,最后一个例子,由于我们在字符串前面添加了 \'PYTHON\' 导致 match 使用原来的正则表达式无法匹配,返回 None 。此时,使用 search 就可以迎刃而解啦:
运行结果:
小结:
参数: re.split(pattern, string, maxsplit=0, flags=0) , split 功能非常强大,以正则表达式匹配到的标志来分隔字符串,比如下面这样一个混乱的字符串,我们要提取其中所有的数字:
下面,我们就来详细介绍一下 split 的用法。
首先,是以单字符切割:
以分号切割时,共产生了 4 个子字符串,放在列表中返回。
下面,还是以单字符切割,但可以使用正则表达式中的 [] 来指定多种字符:
由于字符串 line 中有连续的 2 个分号,逗号或者空格,因此可以使用 [;\\s,]+ 来切割:
最后,上面的字符串在切割时,分隔符都没有被保留下来,使用括号捕获分组,即可保留分隔符:
re.sub 提供比字符串的 replace 方法更加强大的功能:对于输入的字符串 string ,利用正则表达式 pattern 强大的字符串处理功能,实现复杂的字符串替换处理为 repl ,返回被替换后的字符串。
下面的例子中,我们将句子中多余的空格和数字去掉:
如果想要知道替换过程中,共发生了多少次替换,可以使用 subn :
小结:
上述的案例中,我们每次都需要传入正则表达式,相应的函数每次在调用时,都需要编译一次正则表达式。如果上述过程需要多次重复,那么每次都去耗费时间编译正则表达式是很不划算的。
re 模块为我们提供了 compile 函数,用来编译正则表达式模式,返回编译好模式。因此,可以把那些常用的正则表达式编译成正则表达式对象,以提高效率。
格式: re.compile(pattern, flags=0) ,其中 pattern 为编译时用的表达式字符串, flags 为编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的 flags 有:
注:使用按位或 | 连接多个 flags 。
我们上述介绍的 re 模块的匹配、分割、替换函数, compile 函数的返回值类提供了相应的方法,使用方式类似,只是不需要传入正则表达式字符串而已。
由于用法几乎一致,这里就不一一举例啦~
贪婪模式 : * + ? m,n ,正则表达式的重复默认总是尽可能多得向后匹配内容。
非贪婪模式 : *? +? ?? m,n? ,尽可能少的匹配内容。
Python标准库笔记 — re模块
re模块提供了一系列功能强大的正则表达式(regular expression)工具,它们允许你快速检查给定字符串是否与给定的模式匹配(match函数), 或者包含这个模式(search函数)。正则表达式是以紧凑(也很神秘)的语法写出的字符串模式。
1. 常用方法
常用方法 | 描述 |
---|---|
match(pattern, string, flags=0) | 如果字符串string的开头和正则表达式pattern匹配返回相应的MatchObject的实例,否则返回None |
search(pattern, string, flags=0) | 扫描string,如果有个位置可以匹配正则表达式pattern,就返回一个MatchObject的实例,否则返回None |
sub(pattern, repl, string, count=0, flags=0) | 将string里匹配pattern的部分,用repl替换掉,最多替换count次 |
subn(pattern, repl, string, count=0, flags=0) | 和sub类似,subn返回的是一个替换后的字符串和匹配次数组成的元组 |
split(pattern, string, maxsplit=0, flags=0) | 用pattern匹配到的字符串来分割string |
findall(pattern, string, flags=0) | 以列表的形式返回string里匹配pattern的字符串 |
compile(pattern, flags=0)compile(pattern, flags=0) | 把一个正则表达式pattern编译成正则对象,以便可以用正则对象的match和search方法 |
purge() | Clear the regular expression cache |
escape(string) | 把string中除了字母和数字以外的字符,都加上反斜杆 |
2. 特殊匹配符
语法 | 说明 |
---|---|
. | 匹配除了换行符外的任何字符 |
^ | 头匹配 |
$ | 尾匹配 |
* | 匹配前一个字符0次或多次 |
+ | 匹配前一个字符1次或多次 |
? | 匹配前一个字符0次或一次 |
{m,n} | 匹配前一个字符m至n次 |
\\ | 对任一特殊字符进行转义 |
[] | 用来表示一个字符集合 |
| | 或,代表左右任意匹配一个 |
3. 模块方法
re.match(pattern, string, flags=0)
从字符串的开始匹配,如果pattern匹配到就返回一个Match对象实例(Match对象在后面描述),否则放回None。flags为匹配模式(会在下面描述),用于控制正则表达式的匹配方式。
import re
a = ‘abcdefg‘
print re.match(r‘abc‘, a) # 匹配成功
print re.match(r‘abc‘, a).group()
print re.match(r‘cde‘, a) # 匹配失败
>>><_sre.SRE_Match object at 0x0000000001D94578>
>>>abc
>>>None
search(pattern, string, flags=0)
用于查找字符串中可以匹配成功的子串,如果找到就返回一个Match对象实例,否则返回None。
import re
a = ‘abcdefg‘
print re.search(r‘bc‘, a)
print re.search(r‘bc‘, a).group()
print re.search(r‘123‘, a)
>>><_sre.SRE_Match object at 0x0000000001D94578>
>>>bc
>>>None
sub(pattern, repl, string, count=0, flags=0)
替换,将string里匹配pattern的部分,用repl替换掉,最多替换count次(剩余的匹配将不做处理),然后返回替换后的字符串。
import re
a = ‘a1b2c3‘
print re.sub(r‘\\d+‘, ‘0‘, a) # 将数字替换成‘0‘
print re.sub(r‘\\s+‘, ‘0‘, a) # 将空白字符替换成‘0‘
>>>a0b0c0
>>>a1b2c3
subn(pattern, repl, string, count=0, flags=0)
跟sub()函数一样,只是它返回的是一个元组,包含新字符串和匹配到的次数
import re
a = ‘a1b2c3‘
print re.subn(r‘\\d+‘, ‘0‘, a) # 将数字替换成‘0‘
>>>(‘a0b0c0‘, 3)
split(pattern, string, maxsplit=0, flags=0)
正则版的split(),用匹配pattern的子串来分割string,如果pattern里使用了圆括号,那么被pattern匹配到的串也将作为返回值列表的一部分,maxsplit为最多被分割的字符串。
import re
a = ‘a1b1c‘
print re.split(r‘\\d‘, a)
print re.split(r‘(\\d)‘, a)
>>>[‘a‘, ‘b‘, ‘c‘]
>>>[‘a‘, ‘1‘, ‘b‘, ‘1‘, ‘c‘]
findall(pattern, string, flags=0)
以列表的形式返回string里匹配pattern的不重叠的子串。
import re
a = ‘a1b2c3d4‘
print re.findall(‘\\d‘, a)
>>>[‘1‘, ‘2‘, ‘3‘, ‘4‘]
4. Match对象
re.match()、re.search()成功匹配的话都会返回一个Match对象,它包含了很多此次匹配的信息,可以使用Match提供的属性或方法来获取这些信息。例如:
>>>import re
>>>str = ‘he has 2 books and 1 pen‘
>>>ob = re.search(‘(\\d+)‘, str)
>>>print ob.string # 匹配时使用的文本
he has 2 books and 1 pen
>>>print ob.re # 匹配时使用的Pattern对象
re.compile(r‘(\\d+)‘)
>>>print ob.group() # 获得一个或多个分组截获的字符串
2
>>>print ob.groups() # 以元组形式返回全部分组截获的字符串
(‘2‘,)
5.Pattern对象
Pattern对象对象由re.compile()返回,它带有许多re模块的同名方法,而且方法作用类似一样的。例如:
>>>import re
>>>pa = re.compile(‘(d\\+)‘)
>>>print pa.split(‘he has 2 books and 1 pen‘)
[‘he has ‘, ‘2‘, ‘ books and ‘, ‘1‘, ‘ pen‘]
>>>print pa.findall(‘he has 2 books and 1 pen‘)
[‘2‘, ‘1‘]
>>>print pa.sub(‘much‘, ‘he has 2 books and 1 pen‘)
he has much books and much pen
6.匹配模式
匹配模式取值可以使用按位或运算符’|’表示同时生效,比如re.I | re.M, 下面是常见的一些flag。
- re.I(re.IGNORECASE): 忽略大小写
>>>pa = re.compile(‘abc‘, re.I)
>>>pa.findall(‘AbCdEfG‘)
>>>[‘AbC‘]
- re.L(re.LOCALE):字符集本地化
这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\\w
,在英文环境下,它代表[a-zA-Z0-9]
,即所以英文字符和数字。如果在一个法语环境下使用,有些法语字符串便匹配不上。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。
- re.M(re.MULTILINE): 多行模式,改变’^’和’$’的行为
>>>pa = re.compile(‘^\\d+‘)
>>>pa.findall(‘123 456\\n789 012\\n345 678‘)
>>>[‘123‘]
>>>pa_m = re.compile(‘^\\d+‘, re.M)
>>>pa_m.findall(‘123 456\\n789 012\\n345 678‘)
>>>[‘123‘, ‘789‘, ‘345‘]
- re.S(re.DOTALL): 点任意匹配模式,改变’.’的行为
.
号将匹配所有的字符。缺省情况下.
匹配除换行符\\n
外的所有字符,使用这一选项以后,点号就能匹配包括换行符的任何字符。
-
re.U(re.UNICODE): 根据Unicode字符集解析字符
-
re.X(re.VERBOSE): 详细模式
# 这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的
a = re.compile(r"""\\d + # the integral part
\\. # the decimal point
\\d * # some fractional digits""", re.X)
b = re.compile(r"\\d+\\.\\d*")
# 但是在这个模式下,如果你想匹配一个空格,你必须用‘/ ‘的形式(‘/‘后面跟一个空格)
以上是关于Python 标准库模块 - re的主要内容,如果未能解决你的问题,请参考以下文章