正则表达式,主要功能是从字符串中通过特定的模式,搜索想要找到的内容。
语法
import re m = re.search('[0-9]','abcd4ef') print (m.group(0))
re.search()接收两个参数,第一个0-9,我们要从字符串里找的是数字字符,如果第二个参数有符合
要求的字符串,就返回一个对象m,可以通过m.group()的方法找到结果,如果没有符合要求的字符,就返回None
正则表达式的函数
m = re.search(pattern, string) 搜索整个字符串,直到发现符合的字符串
m = re.match(pattern, string) 从头开始检查字符串是否符合正则表达式。必须从字符串的第一个字符开始就相符。
str=re.sub(patter,replacement,string)
str=re.sub('a','b','aaaa') >>> str 'bbbb'
>>> a=re.split('b','abcbd') >>> a ['a', 'c', 'd']
>>> ll=re.findall('b','bbd,df,db') >>> ll ['b', 'b', 'b']
re.split() 根据正则分隔字符串,将分隔后的所有字符串放在一个list表中返回。
re.findall() 根据搜索的字符串,将所有的符合的字符串放在一个表里面
写一个正则表式
单个字符:
. 任意一个字符
a|b 字符a或字符b
[afg] a或f或g中的一个
[0-4] 0-4中的一个字符
[a-f] a-f中的一个字符
[^m] 不是m的一个字符
\s 一个空格
\S 一个非空格
\d [0-9]
\D [^0-9]
\w [0-9a-zA-Z]
\W [^0-9a-zA-Z]
重复
紧跟在单个字符之后,表示多个这样的类似字符
* 重复>=0次
+ 重复>=1次
? 重复0或者1次
{m} 重复m次
{m,n} 重复m到n次,
正则表达 相符的字符串举例
[0-9]{3,5} 8988
a?b b
a+b aaab
位置
^ 字符串的其实位置
$ 字符串的结尾位置
^abcd.*C$
>>> m=re.search("^ab.*c$","abeec") >>> print m.group(0) abeec
返回控制
下面一个正则表达式:
output_(\d{4})
用括号包围一个小的正则表达式,\d{4},这个小的正则表达式用于从结果中帅选信息,用括号括起来的正则表达式的一部分
称为群(group)
>>> m=re.search("output_(\d{4})","output_1986.txt") >>> m.group(0) 'output_1986' >>> m.group(1) '1986'
m.group(0)整个结果,m.group(1)是第一个群
练习
有一个文件,文件名为output_1981.10.21.txt 。下面使用Python: 读取文件名中的日期时间信息,并找出这一天是周几。将文件改名为output_YYYY-MM-DD-W.txt (YYYY:四位的年,MM:两位的月份,DD:两位的日,W:一位的周几,并假设周一为一周第一天)
#!/usr/bin/env python import re import datetime import os listtest=[] m=re.search("output_(\d{4}).(\d{2}).(\d{2}).txt","output_1981.10.21.txt") year=int(m.group(1)) mon=int(m.group(2)) day=int(m.group(3)) d = datetime.datetime(year,mon,day) w=str(d.weekday()+1) print "weekly",d.weekday() nenfile='output_'+m.group(1)+'-'+m.group(2)+'-'+m.group(3)+'-'+w+'.txt' os.rename("output_1981.10.21.txt",nenfile)