p.s. 字符串前加r,就不用考虑转义问题了
s=r’abc\001’
正则表达式是用来匹配字符串(给字符串定义一个规则,符合规则算作匹配,否则字符串不合法)
如何用字符来描述字符
因为正则表达式也是字符串表示的,so首先要了解字符是如何描述字符的。
直接给出字符 | \d | \w | \s | . | \特殊符号 |
---|---|---|---|---|---|
精确匹配 | 匹配一个数字 | 匹配一个数字或字母 | 匹配一个空格 | 匹配任意字符 | 匹配特殊符号 |
* | + | ? | {n} | {n,m} |
---|---|---|---|---|
表示任意个字符(包括0个) | 表示至少一个字符 | 表示0个或1个字符 | 表示n个字符 | 表示n-m个字符 |
- 如
\d{3}\s+\d{3,8}
#有三个数字,至少一个空格,三到八个数字组成的字符串
为了更精确匹配,还可以用[字符类型范围]字符个数范围
表示
[0-9a-zA-Z\_]{6,10}
可以匹配6-10个由数字,大小写字母和下划线组成的字符串[a-zA-Z][0-9a-zA-Z\_]{5-7}
可以匹配由字母开头,后面最多5-7个由数字、大小写字母和下划线组成的字符串(总长度为6-8)
进一步
A|B | ^ | $ |
---|---|---|
可以匹配字符A或B | 表示开头,用来限定字符的开头 | 表示结尾,用来限定字符的结尾 |
re模块
python提供re模块,包含所有正则表达式的功能
r判断正则表达式是否匹配
【格式】
import re
re.match(r'正则表达式','测试字符串')
match()判断是否匹配
- 匹配成果,返回一个match对象
- 匹配不成功,返回None
r’正则表达式’字符串前加r,就不用考虑转义问题了
【例子】
import re
test=input('请输入字符串')
if re.match(r'^\d{3}\-\d{3,8}$', test):
print('OK')
else:
print('failed')
切分字符串
'ab c'.split(' ')
#字符串split无法识别连续的空格
re.split(r'\s+','ab c')
#可以很好切分
如果要对多种符号进行切分:re.split(r'[\s\,]+','a,b, c d')
str.spllit(符号,分割为n份)#切分字符串
分组
如果在正则表达式中定义了组,可以用group()
方法提取子串
【例子】
import re
m=re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
m.group(0) #返回'010-12345'
m.group(1) #返回'010'
m.group(2) #返回'12345'
- group()
group(0)
表示原始字符串group(i)
表示第i个子串groups()
表示全部子串- 定义组:在正则表达式中用
( )
将一部分内容括起来作为一组
贪婪匹配
正则匹配默认是贪婪匹配(匹配尽可能多的字符)
但是这有时候也会带来不便
【例子】
import re
re.match(r'^(\d+)(0*)$', '102300').groups()
因为
\d+
采用贪婪匹配,把后面的00全部匹配了
要使\d+
采用非贪婪匹配,才能把后面的0匹配出来;\d+?
就是非贪婪匹配
编译
为了提高使用效率,可以对正则表达式进行编译
【例子】
import re
#编译
re_telephone=re.compile(r'^(/d{3})-(\d{3,8})$')
#使用
re_telephone.match('010-12345').groups()