最近经常会碰到正则表达式,以前虽然也会写一些,也能够看懂,但毕竟没有系统的研究过,用的时候还是需要常常google。
趁这个机会,进行总结和笔记,希望以后查资料就看自己的文章就够了,不用到处google。
作用
正则表达式的作用,在于描述一类字符串,常用于匹配和检索。
正则表达式不是万能的,并不能匹配全部的字符串,看名字就知道,还有非正则字符串。
常用语法
预定义字符 | 含义 |
---|---|
\d | 数字:[0-9] |
\D | 非数字:[^\d] |
\s | 空白字符:[<空格>\t\r\n\f\v] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[A-Za-z0-9] |
\W | 非单词字符:[^\w] |
普通字符 | 含义 |
---|---|
. | 匹配任意换行符"\n"外的字符 |
abc | 匹配字符本身 |
特殊字符 | 匹配特殊字符,前面加\ 匹配 |
数量字符 | 含义 |
---|---|
* | 匹配前一个字符0或无限次 |
+ | 匹配前一个字符1或无限次 |
? | 匹配前一个字符0或1次 |
{m,n} | 匹配前一个字符m到n次,m和n可省略 |
{m,n}?、*?等 | 非贪婪模式,数量字符都是贪婪的,它们会尽可能多的匹配文字,在它们的后面加上一个? 就可以实现非贪婪或最小匹配匹配特殊字符 |
分组 | 含义 |
---|---|
[] | 字符集,表示对应位置可以是字符集中任意字符 |
| | 或,表示左右表达式任意匹配一个,匹配时短路 |
() | 分组,从左边开始,我一个分组,编号+1 |
\<number> | 引用编号为<number>的分组 |
python的re模块
在python中引用re模块即可在python中使用正则表达式import re
。
正则对象
re模块中,需要把一个正则字符串转换成正则表达式对象,然后使用该对象去执行匹配和替换等操作。
使用pattern = re.compile(r're_string')
把一个正则字符串re_string
转换成正则对象pattern
,在这里建议使用python中的原字符串模式r'...'
填入字符串,可以避免很多转义问题。
有两个常用的对象属性,pattern. pattern
和pattern.groups
,分别输出对象的匹配字符和分组个数。
匹配对象
在执行中,如果不想创建一个pattern,则可以直接使用match = re.match(r're_string','string')
来匹配。
返回值match
就是正则的匹配对象,若没有匹配,返回None
。
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。
re的常用方法
- match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])
从头匹配pattern,若匹配不到,则返回None
- search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):
从字符串所有位置匹配pattern,若匹配不到,则返回None
- split(string[, maxsplit]) | re.split(pattern, string[, maxsplit])
按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。- findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])
搜索string,以列表形式返回全部能匹配的子串。- finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):
搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。- sub(repl, string[, count]) | re.sub(pattern, repl, string[, count])
使用repl替换string中每一个匹配的子串后返回替换后的字符串。
当repl是一个字符串时,可以使用\id或\g<id>、\g<name>引用分组,但不能使用编号0。
当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
count用于指定最多替换次数,不指定时全部替换。- subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]):
返回 (sub(repl, string[, count]), 替换次数)。
参考了csnd博文,引用部分还没有消化成自己的东西,在日常使用中,应该用不到这么多的属性和方法,以后再做删减。先写到这。。。
点到即止