python-正则基础
正则表达式,说的简单些,就是一个匹配的功能,在python中,只要引用 re 模块,就能进行正则匹配操作
一、math匹配
先来看一个简单的例子
import re re.match(pattern, data_source) #math为匹配,pattern为需要匹配的对象,data_source为数据源
查看下匹配的结果
import re a = re.match('abc', 'abcdefg') b = re.match('abc', 'bcdefg') print(a) print(b) -----结果----- <_sre.SRE_Match object; span=(0, 3), match='abc'> #a为匹配到的结果,返回的是一个正则的对象 None #b为没匹配到的结果
查看匹配到的具体结果,需要使用group方法:
import re a = re.match('abc', 'abcdefg') print(a.group()) -----结果----- abc
需要注意的是,math只能从字符串开头进行匹配
import re a = re.match('abc', 'aabcdefg') if a: print('匹配成功') else: print('匹配失败') -----结果----- 匹配失败
在math中除了有group方法查看匹配到的内容外,还有以下几个方法:
import re a = re.match('abc', 'abcdefg') print(a.start()) #查看匹配开始的位置 print(a.end()) #查看匹配结束的位置 print(a.span()) #查看匹配开始和结束的位置 -----结果----- 0 3 (0, 3)
如果想要匹配任意数字,可以这样写:
import re a = re.match('[0-9]', '1234abc') #[0-9]为匹配任意一个数字 b = re.match('[0-9]{1,9}', '1234abc') #[0-9]{1,9}为匹配任意1到9个数字 print(a.group()) print(b.group()) -----结果----- 1 1234
在上面的例子中,我们进行了两次匹配,在匹配的过程中,先需要对匹配的对象进行编译,如果多次匹配时的对象都是相同的,那也会进行多次编辑,这就造成了一定程度上的资源浪费,为了提升匹配效率,我们可以这样写:
import re p = re.compile('[0-9]') #先对匹配对象进行编译 a = p.match('1234aBc') #第一次匹配开头为数字 b = p.match('56abc') #第二次匹配开头为数字 print(a.group()) print(b.group())
二、search
在上文中介绍了math,math是只能从开头进行匹配,如果想从整个字符串的任意位置进行匹配,我们可以使用search:
import re a = re.search('\d', 'b1234abc123') #\d为匹配任意十进制数,相当于[0-9] print(a.group()) -----结果----- 1
需要注意的是,search只要是匹配到了内容,后面的内容就不会进行匹配了
三、findall
findall方法能够以列表的形式返回能匹配的子串,看例子:
import re a = re.findall('[0-9]', '1234abc123') b = re.findall('[0-9]{0,9}', '1234abc123') c = re.findall('[0-9]{1,9}', '1234abc123') print(a) print(b) print(c) -----结果----- ['1', '2', '3', '4', '1', '2', '3'] ['1234', '', '', '', '123', ''] #由于{0,9}是可以匹配到0个数字,因此最终的结果中会匹配到空的字符串 ['1234', '123'] #改为{1,0}后,就无法匹配到0个数字啦
四、sub和subn
之前介绍的几个方法中,只能查看到匹配的结果,如果我们想把匹配到的内容换成另外的内容,就可以使用sub和subn,就是通常意义上的替换
import re a = re.sub('a', 'z', 'b1234abc123aaa') #把a换成z b = re.subn('a', 'z', 'b1234abc123aaa') print(a) print(b) -----结果----- b1234zbc123zzz ('b1234zbc123zzz', 4) #使用subn时,会统计到匹配的次数
如果想要指定替换的次数,可以参入count的参数
import re a = re.sub('a', 'z', 'b1234abc123aaa', count=1) b = re.subn('a', 'z', 'b1234abc123aaa', count=1) print(a) print(b) -----结果----- b1234zbc123aaa ('b1234zbc123aaa', 1)
五、split
split表示在匹配时对字符串进行分割,分割完后存入一个列表中
import re a = re.split('[0-9]', 'xiaohong1xiaosun') print(a) -----结果----- ['xiaohong', 'xiaosun']
六、正则表达式
元字符 | 说明 |
---|---|
. | 代表任意字符 |
| | 逻辑或操作符 |
[ ] | 匹配内部的任一字符或子表达式 |
[^] | 对字符集和取非 |
- | 定义一个区间 |
\ | 对下一字符取非(通常是普通变特殊,特殊变普通) |
* | 匹配前面的字符或者子表达式0次或多次 |
*? | 惰性匹配上一个 |
+ | 匹配前一个字符或子表达式一次或多次 |
+? | 惰性匹配上一个 |
? | 匹配前一个字符或子表达式0次或1次重复 |
{n} | 匹配前一个字符或子表达式 |
{m,n} | 匹配前一个字符或子表达式至少m次至多n次 |
{n,} | 匹配前一个字符或者子表达式至少n次 |
{n,}? | 前一个的惰性匹配 |
^ | 匹配字符串的开头 |
\A | 匹配字符串开头 |
$ | 匹配字符串结束 |
[\b] | 退格字符 |
\c | 匹配一个控制字符 |
\d | 匹配任意数字 |
\D | 匹配数字以外的字符 |
\t | 匹配制表符 |
\w | 匹配任意数字字母下划线 |
\W | 不匹配数字字母下划线 |