正则表达式是一些由字符串和特殊字符组成的字符串,它用一种描述性的语言来给字符串定义一个规则,这个规则模式可以用来匹配一系列具有相似特征的字符串,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
正则表达式常用的特殊符号和字符
Python字符串中特殊字符需要使用'\'进行转义,而使用Python的r前缀,可以不用考虑转义的问题,所以建议使用r前缀
正则表达式
|
说明
|
正则表达式举例
|
匹配的字符串举例
|
直接给出字符
|
精确匹配
|
"foo"
|
"foo","food"
|
.
|
匹配除换行符之外的 任意字符
|
|
|
\d
|
匹配一个数字
|
|
|
\w
|
匹配一个字母或者数字
|
|
|
\s
|
匹配任何空白符
|
\s
|
" "
|
^
|
匹配开头
|
^Dear
|
"Dear Mr"
|
$
|
匹配结尾
|
.py$
|
"test.py"
|
*
|
匹配前面的正则表达式零次或者多次
|
a\d*
|
"a","a78"
|
+
|
匹配前面的 正则表达式一次或者多次
|
a\d+
|
"a3","a22"
|
?
|
匹配前面的 正则表达式零次或者一次
|
a\d?
|
"a","a4"
|
{N}
|
匹配前面的正则表达式N次
|
a\d{3}
|
"a245"
|
{N,M}
|
匹配前面的正则表达式N到M次
|
a\d{3,8}
|
"a12345"
|
[...]
|
匹配中括号中的任意一个字符
|
[3fod]
|
"3","f","o","d"
|
[x-y]
|
匹配x到y中的任意一个字符
|
[0-9a-zA-Z]
|
任意一个数字或者字母
|
[^...]
|
不匹配中括号中的任何字符
|
[^0-9]
|
非数字字符
|
x|y
|
匹配x或者y
|
foo|bar
|
"foo","bar"
|
re模块常用函数介绍
match(Pattern,String) 用正则表达式Pattern匹配字符串String,如果匹配成功,则返回一个Match对象,否则返回None>>> import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
None
match()函数尝试从String的开头开始进行匹配
>>print(re.match(r'foo','food'))
<_sre.SRE_Match object; span=(0, 3), match='foo'>
>>print(re.match(r'foo','goodfood'))
None
search(Pattern,String) 在String中查找Pattern匹配的第一次出现,如果匹配成功则返回一个匹配对象,否则返回None
search()函数并不是从开头处匹配,而是从左到右进行搜索
>>print(re.search(r'foo','seafood'))
<_sre.SRE_Match object; span=(4, 7), match='foo'>
findall(Pattern,String) 在String中查找Pattern匹配的所有非重复出现,返回匹配对象的列表
>>re.findall(r'\d+','age is 25, number is 923')
['25', '923']
sub(Pattern,Repl,String)把String中所有匹配Pattern的地方替换成字符串Repl
>>re.sub(r'\s+','-','010 1234 5678')
010-1234-5678
split(Pattern,String)根据Pattern中的分隔符把String分隔成一个列表并返回这个列表
普通的切片,不能识别连续的空格
>>> 'a b c'.split(' ')
['a', 'b', '', '', 'c']
>>> re.split(r'\s+', 'a b c')
['a', 'b', 'c']
>>> re.split(r'[\s\,]+', 'a,b, c d')
['a', 'b', 'c', 'd']
提取分组
除了判断是否匹配之外,还经常需要从字符串中提取出匹配的子串,这就用到了正则表达式的分组功能。
正则表达式中一个()表示一个要提取的分组
比如^(\d{3})-(\d{3,8})$分别定义了两个组,分别可以用group(1)和group(2)提取,group(0)用于提取完整的匹配字符串,groups()返回子组的集合
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'
>>> m.groups()
('010', '12345')
贪婪匹配
正则表达式默认采用贪婪匹配,也就是匹配尽可能多的字符。
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
(\d+)尽可能多的匹配字符,所以将后面的0全部匹配,导致(0*)没有匹配到任何字符。
必须让(\d+)采用非贪婪匹配,也就是尽可能少的匹配字符,(0*)才能将0匹配出来。
\d+后面加上一个?就表示采用非贪婪匹配,?是非贪婪操作符,可以用在“*”,“+”,“?”的后面。
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')
参考资料:
阅读(1241) | 评论(0) | 转发(0) |