字符串与正则表达式
一.字符串
1.格式化浮点数字
'%f'%1.25 输出:1.250000(默认输出小数点后的6位数字)
'%.2f'%1.25 输出:1.25 (精确到小数点后两位)
2.字符串与日期的转换
例:
import time,datetime
time.strftime("%Y-%m-%d %X",time.localtime())
t=time.strptime('2018-08-08','%Y-%m-%d')
y,m,d=t[0:3]
3.正则表达式
3-1:特殊字符
^:正则表达式的开始字符
$:正则表达式的结束字符
\w:匹配字母,数字,下划线
\W:匹配非字母,数字,下划线的字符
\s:匹配空白字符
\S:匹配非空白字符
\d:匹配数字
\D:匹配非数字的字符
\b:匹配单词的开始和结束
\B:匹配不是单词的开始和结束的位置
. :匹配任意字符,包括汉字
[m]:匹配单个字符串
[m1,m2]:匹配多个字符串
[m-n]:匹配m到n区间内的数字,字母
[^m]:匹配除m以外的字符串
():对正则表达式进行分组,一对圆括号表示一组
规则选项
I:忽略大小写
L:字符集本地化,用于多语言环境
M:多行匹配
S:是"."匹配"\n"在内的所有字符
X:忽略正则表达式中的空白,换行,方便添加注释
U: \w,\W,\B,\b,\d,\D,\s,\S都将使用unicode
3-2:常用限定符
*:匹配0次或多次
+:匹配一次或多次
?:匹配一次或0次
{m}:重复m次
{m,n}:重复m到n次,其中n可以省略,表示m到任意次
限定符与?号的组合
*?:匹配0次或多次,且最短匹配
+?:匹配一次或多次,且最短匹配
??:匹配一次或0次,且最短匹配
{m,n}:重复m次,且最短匹配
(?#...):正则表达式中的注释
(?P<name>...):给分组命名,name表示分组的名称
(?P=name):使用名为name的分组
例:
[\(-]? :表示做多只能取"("或"-"其中一个
处理正则表达式的模块:re
re的常用函数:
findall(pattern,string,flags=0):根据pattern在string中匹配字符串
sub():根据指定的正则表达式,替换原字符串中的子串 (注:先创建s的拷贝,然后在拷贝中替换字符串,并不会改变s的内容)
subn():作用和sub相同,返回一个二元的元组
match(pattern,string,flags=0):根据pattern从string的头部开始匹配字符串,只返回第一次匹配成功的对象
search():根据pattern在string中匹配字符串,只返回第一次匹配成功的对象
compile():编译正则表达式pattern,返回1个Pattern对象
split():根据pattern分隔string,maxsplit表示最大的分隔数
escape():匹配字符串中的特殊字符,如*,+,?
例:
import re
s='HELLO WORLD'
re.findall(r'^hello',s) #结果为:[]
re.findall(r'^hello',s,re.I) #re.I表示忽略大小写
re.findall(r'\b\w+\b',s) #:结果为:['HELLO', 'WORLD']
替换指定字符串中的子串:
import re
s='hello world'
re.sub('hello','hi',s) #hi world
re.sub('hello','hi',s[-4:]) #因为没有找到匹配的子串,所有输出结果为s[-4:],即orld
tel3='(010)12345678'
print(re.findall(r'[\(]?\d{3}[\)-]?\d{8}|[\(]?\d{4}[\)-]?\d{7}',tel3))
正则表达式的解析非常费时,如果多次使用findall()的方式匹配字符串,搜索效率会很低,可以使用compile()进行预编译,该函数返回一个pattern对象
pattern对象的属性和方法如下:
pattern:获取当前使用的正则表达式
findall(string[,start[,end]]):查找所有符合pattern对象匹配条件的结果,返回一个包含匹配结果的列表。
finditer(string[,start[,end]]):返回一个包含匹配结果的地址
match():用法同re.match()
search():用法同re.search()
例:
import re
s='1abc23def45'
p=re.compile(r'\d+')
print(p.findall(s))
print(p.pattern)
函数compile()通常与match(),search(),group()一起使用,对含有分组的正则表达式进行解析。match()与search()将返回一个match()对象,
match()对象的方法和属性:
pos:搜索的开始位置
endpos:搜索的结束位置
string:搜索的字符串
re:当前使用的正则表达式的对象
lastindex:最后匹配的组索引
lastgroup:最后匹配的组名
group(index=0):某个分组的匹配结果,如果index等于0表示匹配整个正则表达式
groups():所有分组的匹配结果,每个分组的结果组成一个列表返回
groupdict():返回组名作为 key,每个分组的匹配结果作为value的字典
start([group]):获取组的开始位置
end([group]):获取组的结束位置
span([group]):获取组的开始和结束位置
expand(template):使用组的匹配结果来替换模板template中的内容,并把替换后的字符串返回
例:
import re
p=re.compile(r'(abc)\1')
m=p.match('abcabcabc')
print(m.group(0),m.group(1),m.group())
p=re.compile(r"(?P<one>abc)(?P=one)")
m=p.search("abcabcabc")
print(m.group("one"))