re — 正则表达式操作 是 Python 标准库 » 文本处理服务 中的模块,这个模块提供了正则表
正则表达式语法
一个正则表达式(或RE)指定了一集与之匹配的字符串;模块内的函数可以让你检查某个字符串是否跟给定的正则表达式匹配
注意Python的字符串本身也用’'转义,所以要特别注意,一般我们都建议使用Python的r前缀,就不用考虑转义的问题了
1,行的起始
例子:匹配‘cat’ 开头
patt=re.compile(r’^cat’) # re.compile 返回一个正则表达式对象
表示匹配以c作为一行的第一个字符,后面跟着a,后面跟着t
所以’vocative’就不会被匹配到,原因是因为cat在字符的里面
2,行的结尾
import re
sentence = '''Hi Jack:\n
Python is a beautiful language\n
BR'''
patt = re.compile(r'(BR|Bestregards)$')
m = re.search(patt,sentence)
if m :
print 'match'
else:
print 'not match'
>>
match
要查找sentence中是否以“BR或Bestregards” 结尾
3 ,单词的边界
正则里面有2个特殊字符\b and \B来匹配单词的边界 :
\b 匹配的模式是一个单词的边界(不论这个单词的前面是有字符还是没有字符)
\B 匹配出现在一个单词中间的模式
例如:
the #匹配包含有’the’的字符串
\bthe #匹配任何以’the’开始的字符串
\bthe\b #仅仅匹配单词’the’
\Bthe #匹配任意包含’the’但不以’the’开头的单词
4,字符组
比如我们需要匹配’grey’或者’gray’的时候,怎么办,可以用正则的[]来表示,gr[ea]y,表示先找到g,然后找到r,然后找到e或者a,最后是一个y
patt=re.compile(r’gr[ea]y’)#意思就是grey 或者gray都是可以匹配上的
5,多选结构
我们可以用’|‘来匹配任意子表达式,’|‘是一个非常简便的元字符,它的意思是"或",通过它我们能把不同的子表达式组合成一个总的表达式,比如’am’|‘pm’就是能够同时匹配其中任意一个的正则表达式,回头再看上面的例子’gr[ea]y’,其实能写成’grey|gray’,或者’gr(e|a)y’
6、可选项元素
‘?’ 表示可选项,问号跟在什么后面就表示什么是可选的
例如:6月4日,可能写成’June’也可以写成’Jun’,而且日期也有可能写作’fourth’或者’4th’或者4,这个时候就可以写成June?(fourth|4(th)?),代表了e是可选的,th是可选的,可有可无都表示4号
7,重复出现
+,表示紧邻元素重复出现一次或者多次,至少出现一次,否则返回失败;
,表示紧邻元素重复出现0次或者多次,允许出现0次;
例如:
a表示0个或者多个a,所以为0的时候,就是空字符
a+表示1个或者多个a,所以a至少要有1次
8,匹配重复的次数
次数用{}里面的数字来表示
例如:patt=re.compile(r’([1-9]{3})’) 就表示匹配1-9之间的数字,且这个数字只能出现3次,str=‘123str’ ,就可以匹配上,而str1=‘2str1’就不能匹配,如果想匹配上要这么写patt1=re.compile(r’([1-9]{1-3})’),1-9数字出现1次或2次或3次
9、排除型字符组
当^在字符组的外面的时候"表示一个行的开头"
当^在字符组的内部(而且是必须紧接着字符组的第一个方括号之后),它就是一个元字符,表示排除型
例如:找出字母g后面的字母不是u
import re
words=['gold',' Google','Sogu','Guess']
patt=re.compile(r'.*g[^u]') #‘.’匹配任意一个字符,'*'匹配0个或多个字符,g后面不是u
for w in words:
m=re.match(patt,w)
if m:
print w
>>goldGoogle
实战小例子
1,匹配1-100之间的数
import re
s = '100' # 1-100内的任意数字
ret = re.match(r'(100|[1-9]\d{0,1})$',s)
print(ret.group())
代码 功能
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配非特殊字符,即a-z、A-Z、0-9、、汉字
\W 匹配特殊字符,即非字母、非数字、非汉字、非
2,匹配座机号码
010-67132692,其构造规则为[3位数字][-][8位数字]
或者
0431-4978981,其构造规则为[4位数字][-][7位数字]
import re
s = "010-67132692"
ret = re.search(r'^\d{3,4}-\d{7,8}$' , s)
print(ret.group())
3,对输入的qq号进行匹配(qq匹配规则:长度为5-10位,纯数字组成,且不能以0开头。)
import re
s = "1101111123"
ret = re.match(r'[1-9]\d{4,9}$' , s)
if ret != None:
print(ret.group())
else :
print('匹配失败!')
4,过滤字符串中的只含2个字符的字母,并且第一个字母是大写A或B或C
patt=r'[A-C][A-Z a-z]'
5,过滤一个字符串中的含3个字母的独立字符
例如:比如这样的一个字符串’xy,1,2,?,123@sohu,Ab,w1,Cz,xyh,abc’,只想过滤出来xyh,abc 这样的
patt=r'/b[a-z A-Z]{3}/b' #/b 单词的边界
6、过滤一个字符串中的含3个字母的字符,并且最后一个字母是z
patt=r'/b[a-z A-Z][a-z A-Z][Z]/b'
7,过滤正确的24小时时间制
import re
time='10:00,99:90,8:00,19:19:14:00pm,5:xm,6,00,8:0923:23pm,29:19pm,23:59'
patt = r'\b([01]?[0-9]|2[0-4])(:)([0-5][0-9])'
match = re.findall(patt,time)
if match:
print([''.join(x)for x in match])执行结果:['10:00', '8:00', '19:19', '14:00', '8:09', '23:59']