正则表达式也称为 REs
一、常用的匹配
\d 任意十进制数字
\s 任意空白字符(空格、换行、制表)
\w 任意单词和数字
\b 单词的开始或结束
[abc$] a或b或c或$,虽然$是元字符,但是方括号里匹配其本身
* 0次或多次
+ 1次或多次
? 0次或1次
. 换行符以外的任意字符
{m} m次
{m,} m次或m次以上
{m,n} m次到n次(包含m、n次本身)
^ 开始位置
$ 结束位置
| 或
二、反斜杠\与原始字符串
Python本身处理字符串时,反斜杠用于转义字符,\\代表引用\本身;正则表达器查询\时,需要转义\本身,所以需要四个反斜杠\\\\(可以看成(\\)(\\))。也就是说,匹配\需要四个反斜杠\\\\。
反斜杠过多容易导致代码难以阅读,因为这个原因,Python在使用正则表达式最好使用原始字符串。
比如,正则字符串"\\w+\\d"改写成r"\w+\d",以此类推。
三、匹配方法
match() 判断正则表达式是否从开始处匹配一个字符串
search() 遍历字符串,找到第一个位置
findall() 遍历字符串,找到所有位置,并以列表形式返回
finditer() 遍历字符串,找到所有位置,并以迭代器形式返回
group() 返回匹配的字符串
start() 返回匹配的开始位置
end() 返回匹配的结束位置
span() 返回匹配位置
一个例子:
import re
p=re.compile('\w+')
p.match("")
print(p.match(""))
m=p.match('liangzuojiayi')
print(m)
print(m.group())
print(m.start())
print(m.end())
print(m.span())
print()
m0=p.match('~~~liangzuojiayi')#match()是从开始处匹配
print(m0)
m1=p.search('~~~liangzuojiayi')
print(m1)
print(m1.group())
print(m1.start())
print(m1.end())
print(m1.span())
print()
q=re.compile('\d+')
print(q.findall('1liang2zuo3jia4yi'))
iterator=q.finditer('1liang2zuo3jia4yi')
print(iterator)
for match in iterator:
print(match.span())
结果显示:
None
<_sre.SRE_Match object; span=(0, 13),
match='liangzuojiayi'>
liangzuojiayi
0
13
(0, 13)
None
<_sre.SRE_Match object; span=(3, 16), match='liangzuojiayi'>
liangzuojiayi
3
16
(3, 16)
['1', '2', '3', '4']
<callable_iterator object at 0x00000000093CC2B0>
(0, 1)
(6, 7)
(10, 11)
(14, 15)