1.group
除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如:^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码
m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
print(m.group(0))
print(m.group(1))
print(m.group(2))
010-12345
010
12345
如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。
注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。
t = '19:05:30'
m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
print(m.groups())
输出:
('19', '05', '30')
2.贪心匹配
print(re.match(r'^(\d+)(0*)$', '102300').groups())
('102300', '')
print(re.match(r'^(\d+?)(0*)$', '102300').groups())
('1023', '00')
由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串,加个?就可以让\d+采用非贪婪匹配;
3.编译
如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式
编译
tele = re.compile(r'^(\d{3})-(\d{3,8})$')
使用:
print(tele.match('010-12345').groups())
('010', '12345')
print(tele.match('010-8086').groups())
('010', '8086')
python3进阶之正则表达式之re模块之切分字符串
print('a b c'.split(' '))
print(re.split(r'\s+','a b c'))
print(re.split(r'[\s,;]+', 'a,b;; c d'))
注意+号的位置
输出:
['a', 'b', '', '', 'c']
['a', 'b', 'c']
['a', 'b', 'c', 'd']
通配符:句点.(.ython与jpython与python与 ython都匹配,但不与ython不与tpython匹配,因为一个句点只匹配一个字符,而不与零或两个字符匹配,除换行符外与其他字符都匹配。
特殊字符:通配符也属于特殊字符,例,想要匹配‘python.org’,可以直接使用模式‘python.org’,但它也与‘pythonzorg'匹配(因为.是通配符啊,滑稽脸~)想要特殊字符与普通字符一样,可对其进行转义(2种方式)
python\.org #两个反斜杠包括两层转义:解释器执行的转义,模块re执行的转义r'python.org'
字符集:[],只能匹配一个字符
例如,[pj]ython与python与jython匹配
可使用范围:[a-z]与a~z的任何字母都匹配
[a-zA-Z0-9]与大写字母,小写字母,数字都匹配
二选一模式:管道字符 |
python|perl
子模式:
p(ython|erl)
可选模式:在子模式后面加上问号
r'(http://)?(www.)?python.org'
重复模式:
(pat)* #可重复多次(pat)+ #可重复1或多次(pat){m,n} #可重复m~n次
确定字符串的开头和末尾是否与模式匹配:^,$
第一:转义字符:
改变原有字符的意义,一般都以反斜杠\作为起始。
\n 意思是换行,不再表示字母n。
第二:python中,反斜杠\本身就是个转义字符。
1、\,第一个反斜杠表示转义,意思是第二反斜杠不再视为一个转义字符。
print('\')
打印输出单独一个\。
2、加一个r【r是原始字符的简写:raw string】,就表示废掉python中\的转义能力。
print(r'\')
打印输出两个\反斜杠。
第三:python中re模块,本身又指定\为转义字符。
因为我们知道,在python看来\字符,实际上只是一个\反斜杠。
1、加r
test_string='a\kk\\cc'print(test_string)u=re.compile(r'\\')z=u.findall(test_string)print(z)print(str(*z))
打印结果: a\kk\cc
['\\']
\
python对字符需要转义,但是我们看到z它是列表形式,所有输出了4个反斜杠;当我们把它转行成字符串,在打印就是\了
2、不加r
import retest_string='a\kk\\cc'print(test_string)u=re.compile('\\')z=u.findall(test_string)print(z)
打印结果:a\kk\cc
['\', '\', '\']