python正则化
一、re模块简介
聊到Python正则表达式的支持,首先肯定会想到re库,这是一个Python处理文本的标准库。
标准库的意思表示这是一个Python内置模块,不需要额外下载,目前Python内置模块大概有300个。可以在这里查看Python所有的内置模块:https://docs.python.org/3/py-modindex.html#cap-r
因为re是内置模块,所以不需要再下载,使用时直接引入即可:
import re
re模块官方文档:https://docs.python.org/zh-cn/3.8/library/re.html
re模块库源码:https://github.com/python/cpython/blob/3.8/Lib/re.py
二、re模块常量
常量即表示不可更改的变量,一般用于做标记。
re模块中有9个常量,常量的值都是int类型!
re.compile(strPattern[, flag]):
这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。
可选值有:
-
re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
-
M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)
-
S(DOTALL): 点任意匹配模式,改变'.'的行为
-
L(LOCALE): 使预定字符类 \\w \\W \\b \\B \\s \\S 取决于当前区域设定
-
U(UNICODE): 使预定字符类 \\w \\W \\b \\B \\s \\S \\d \\D 取决于unicode定义的字符属性
-
X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的:
a = re.compile(r"""\\d + # the integral part\\. # the decimal point\\d * # some fractional digits""", re.X)
b = re.compile(r"\\d+\\.\\d*")
-
re提供了众多模块方法用于完成正则表达式的功能。这些方法可以使用Pattern实例的相应方法替代,唯一的好处是少写一行re.compile()代码,但同时也无法复用编译后的Pattern对象。这些方法将在Pattern类的实例方法部分一起介绍。如上面这个例子可以简写为:
m = re.match(r'hello', 'hello world!')
print m.group()
三.Match
Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。
属性:
-
string: 匹配时使用的文本。
-
re: 匹配时使用的Pattern对象。
-
pos: 文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
-
endpos: 文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
-
lastindex: 最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。
-
lastgroup: 最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。
方法:
-
group([group1, …]):
获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时,返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。
-
groups([default]):
以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。
-
groupdict([default]):
返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。default含义同上。
-
start([group]):
返回指定的组截获的子串在string中的起始索引(子串第一个字符的索引)。group默认值为0。
-
end([group]):
返回指定的组截获的子串在string中的结束索引(子串最后一个字符的索引+1)。group默认值为0。
-
span([group]):
返回(start(group), end(group))。
-
expand(template):
将匹配到的分组代入template中然后返回。template中可以使用\\id或\\g<id>、\\g<name>引用分组,但不能使用编号0。\\id与\\g<id>是等价的;但\\10将被认为是第10个分组,如果你想表达\\1之后是字符'0',只能使用\\g<1>0。
import re
m = re.match(r'(\\w+) (\\w+)(?P<sign>.*)', 'hello world!')print "m.string:", m.string
print "m.re:", m.re
print "m.pos:", m.pos
print "m.endpos:", m.endpos
print "m.lastindex:", m.lastindex
print "m.lastgroup:", m.lastgroupprint "m.group(1,2):", m.group(1, 2)
print "m.groups():", m.groups()
print "m.groupdict():", m.groupdict()
print "m.start(2):", m.start(2)
print "m.end(2):", m.end(2)
print "m.span(2):", m.span(2)
print r"m.expand(r'\\2 \\1\\3'):", m.expand(r'\\2 \\1\\3') output
# m.string: hello world!
# m.re: <_sre.SRE_Pattern object at 0x016E1A38>
# m.pos: 0
# m.endpos: 12
# m.lastindex: 3
# m.lastgroup: sign
# m.group(1,2): ('hello', 'world')
# m.groups(): ('hello', 'world', '!')
# m.groupdict(): {'sign': '!'}
# m.start(2): 6
# m.end(2): 11
# m.span(2): (6, 11)
# m.expand(r'\\2 \\1\\3'): world hello!
三.Pattern
Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。
Pattern不能直接实例化,必须使用re.compile()进行构造。
Pattern提供了几个可读属性用于获取表达式的相关信息:
-
pattern: 编译时用的表达式字符串。
-
flags: 编译时用的匹配模式。数字形式。
-
groups: 表达式中分组的数量。
-
groupindex: 以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。
四.以下是一些常用的Python正则表达式:
-
匹配单个字符:
-
. 匹配任意一个字符
匹配括号内的任意一个字符
-
[^ ] 匹配除括号内的字符之外的任意一个字符
-
匹配多个字符:
-
匹配前一个字符出现0次或多次
-
匹配前一个字符出现1次或多次
-
? 匹配前一个字符出现0次或1次
-
{m,n} 匹配前一个字符出现m到n次
-
匹配边界:
-
^ 匹配行的开头
-
$ 匹配行的结尾
-
\\b 匹配单词边界
-
匹配特殊字符:
-
\\d 匹配任意一个数字
-
\\D 匹配任意一个非数字字符
-
\\w 匹配任意一个字母、数字或下划线
-
\\W 匹配任意一个非字母、数字或下划线字符
-
\\s 匹配任意一个空白字符
-
\\S 匹配任意一个非空白字符
以下是一个简单的示例,展示如何使用正则表达式在Python中匹配一个字符串中的所有数字:
import retext = "hello, 123456 world!"
pattern = "\\d+"
result = re.findall(pattern, text)print(result) # ['123456']
在这个示例中,我们使用re模块的findall()函数来查找匹配模式\\d+的所有数字。findall()函数返回一个包含所有匹配结果的列表。