一、
正则表达式基础
1.1.
概念介绍
正则表达式是用于处理字符串的强大工具,它并不是
Python
的一部分。
其他编程语言中也有正则表达式的概念,
区别只在于不同的编程语言实现支持的语法数
量不同。正则表达式,又称正规表示法、常规表示法(英语:
Regular Expression
,在代码中
常简写为
regex
、
regexp
或
RE
)
,计算机科学的一个概念。正则表达式使用单个字符串来描
述、
匹配一系列符合某个句法规则的字符串。
在很多文本编辑器里,
正则表达式通常被用来
检索、替换那些符合某个模式的文本。
正则表达式的大致匹配过程是:
1.
依次拿出表达式和文本中的字符比较,
2.
如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。
3.
如果表达式中有量词或边界,这个过程会稍微有一些不同。
1.2.Python
支持的正则表达式元字符和语法:
'.'
点号,在普通模式,它匹配除换行符外的任意一个字符;如果指定了
DOTALL
标记,
匹配包括换行符以内的任意一个字符。
'^'
尖尖号,匹配一个字符串的开始,在
MULTILINE
模式下,也将匹配任意一个新行的
开始。
'$'
美元符号,匹配一个字符串的结尾或者字符串最后面的换行符,在
MULTILINE
模式
下,也匹配任意一行的行尾。也就是说,普通模式下,
foo.$
去搜索
'foo1\nfoo2\n'
只会找
到’
foo2
′,但是在
MULTILINE
模式,还能找到
‘
foo1
′,而且就用一个
$
去搜索
'foo\n'
的话,会找到两个空的匹配:一个是最后的换行符,一个是字符串的结尾,演示:
>>> re.findall('(foo.$)', 'foo1\nfoo2\n')
['foo2']
(注:在
foo.$
情况下匹配一个字符串的结尾,在
foo1.$
情况下匹配换行符)
>>> re.findall('(foo.$)', 'foo1\nfoo2\n', re.MULTILINE)
['foo1', 'foo2']
>>> re.findall('($)', 'foo\n')
['',
''](
注:
‘,
’只是分隔符的作用
)
'*'
星号,指定将前面的
RE
重复
0
次或者任意多次,而且总是试图尽量多次地匹配。
'+'
加号,指定将前面的
RE
重复
1
次或者任意多次,而且总是试图尽量多次地匹配。
'?'
问号,指定将前面的
RE
重复
0
次或者
1
次,如果有的话,也尽量匹配
1
次。
*?
,
+?
,
??
从前面的描述可以看到
'*'
,
'+'
和
'?'
都是贪婪的,但这也许并不是我们说要的,所以,
可以在后面加个问号,将策略改为非贪婪,只匹配尽量少的
RE
。示例,体会两者的区别:
>>> re.findall('<(.*)>', '
title
')['H1>title']
(注:查找
<>
中间的内容,查找尽量多的匹配内容)