一、什么是正则表达式?
正则表达式在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索/替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。
二、正则表达式匹配规则
语法 |
说明 |
实例 |
结果 |
一般字符 |
匹配字符本身 |
abc |
abc |
. |
匹配除"\n"外的任意字符, 在DOTALL模式也可以匹配到"\n" |
a.c |
abc |
\ |
转义字符 |
\\n |
\n |
[...] |
可以逐个列出[abc], 也可以用一个区间[a-c], [^abc]表示非这个区间的都可以匹配 指定一个集合, 括号中的只要有都可以匹配到 |
a[a- c]c |
abc aac acc |
\d |
匹配数字: [0-9] |
[0-1] |
0 1 |
\D |
匹配非数字: [^\d] |
a\Dc |
abc |
\s |
空白字符:[空格\t\s\r\n\v\f] |
a\sc |
a c |
\S |
匹配非空白字符: [^\s] |
a\Sc |
abc |
\w |
单词字符: [A-Za-z0-9_] |
a\wc |
abc |
* |
匹配前一个字符0或者多次 |
abc* |
abccc ab |
+ |
匹配前一个字符1次或多次 |
abc+ |
abccc abc |
? |
匹配前一个字符0次或1次 |
ab? |
a ab |
{m} |
匹配前一个字符m次 |
a{2} |
aa |
{m,n} |
匹配前一个字符m-n次 |
a{1,2} |
a aa |
^ |
匹配字符串开头 多行模式中匹配每一行的开头 |
^abc |
abc |
$ |
匹配字符串末尾 多行模式中匹配每一行的末尾 |
abc$ |
abc |
| |
或者 |
a|b |
a b |
(...) |
分组, 下标从1开始, 0只匹配结果本身 |
a(b) {2}c |
abb |
.* |
贪婪模式, 尽可能匹配多的结果 |
||
.*? |
非贪婪模式, 尽可能少的匹配结果 |
三、python中re模块的常用方法
pattern对象常用方法:
- match:从起始位置开始查找,一次匹配
- search:从任何位置开始查找,一次匹配
- findall:全部匹配,返回列表
- finditer:全部匹配,返回迭代器
- split:分割字符串,返回列表
- sub:替换
- compile:正则预编译,方便后面调用
1、match
match方法用于查找字符串的头部,它是匹配一次,只要找到了一个匹配结果就返回,而不是查找所有匹配的结果。它的一般使用形式如下:
match(string[, pos[, endpos]])
当匹配成功时,返回一个match对象,如果没有匹配上,则返回none。对于匹配成功的match对象,如果要提取数据可:
- group([group1, ...])方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用group()或group(0);
- start([group])方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为0;
- end([group])方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为0;
- span([group])方法返回(start(group),end(group)).
2、search
search方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果,一般使用形式如下:
search(string[, pos[, endpos]])
当匹配成功时,返回一个match对象,如果没有匹配上,则返回none。
3、findall
match和search方法都是一次匹配,只要找到了一个匹配结果就返回。而在大多数时候,我们需要搜索整个字符串,获得所有匹配结果。使用形式如下:
findall(string[, pos[, endpos]])
findall以列表形式返回全部能匹配的子串,如果没有匹配,则返回一个空列表。
4、finditer
finditer方法的行为跟findall类似, 也是搜索整个字符串,获得所有匹配结果,但返回的是一个顺序访问每一个匹配结果的迭代器。
5、split
split方法按照能够匹配的子串将字符串分割后返回列表,使用形式如下:
split(string[, maxsplit])
其中,maxsplit用于指定最大分割次数,不指定将全部分割。
6、sub
sub方法用于替换,使用形式如下:
sub(repl, string[, count])
其中,repl可以是字符串也可以是一个函数:
- 如果repl是字符串,则会使用repl去替换字符串每一个匹配的子串,并返回替换后的字符串,另外,repl还可以使用id的形式来引用分组,但不能使用编号0;
- 如果repl是函数,这个方法应当只接受一个参数(match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组);
- count用于指定最多替换次数,不指定时全部替换。
re模块的正则修饰符
re.I
re.IGNORECASE 忽略大小写匹配
re.M
re.MULTILINE 设置后样式字符‘^’匹配字符串的开始,和每一行的开始(换行符后紧跟的符号,也就是多行匹配)
re.S
re.DOTALL 让‘.’特殊字符匹配任何字符,包括换行符。(‘.’本意匹配任何字符,\n除外)