基础知识了解下先,各位:
1、正则表达式的常用符号
. 可以匹配任意字符,换行符\n除外
* 匹配前一个字符0次或无限次
? 匹配前一个字符0次或1次
.* 贪心算法
.*? 非贪心算法
() 括号内的数据作为结果返回
2、正则表达式的常用方法
findall:匹配所有符合规律的内容,返回包含结果的列表
search:匹配并提取第一个符合规律的内容,返回一个正则表达式对象(object)
sub:替换符合规律的内容,返回替换后的值
#coding:utf-8
#导入正则表达式
import re
#刚才我们需要破译的密码
secret_code="laodhfejzuwxyzixyzladivhwanxyzlovexyzawidhlxyzpythonxyzasdwia"
#.的使用,代表占位符
a="xz123xs"
b=re.findall('x.', a)
print b #输出结果为['xz', 'xs'],在a这个字符串中找到x和紧跟其后的一个字符
# *的使用
a="xyxy123"
b=re.findall('x*',a)
print b #输出结果为['x', '', 'x', '', '', '', '', ''],因为*可以表示0个或多个,找到x的位置就显示为x,没有找到就为空
# ?的使用
a="xy123"
b=re.findall('x?',a)
print b #输出结果为['x', '', '', '', '', '']
'''上面的只需简单了解,下面这种重点掌握'''
# .*的使用
b=re.findall('xyz.*xyz',secret_code)#从顶端的密码中查找匹配
print b #输出结果为['xyzixyzladivhwanxyzlovexyzawidhlxyzpythonxyz']贪心算法,从第一个xyz开始到最后一个xyz结束能找到多少找多少
c=re.findall("xyz.*?xyz",secret_code)
print c #输出结果为['xyzixyz', 'xyzlovexyz', 'xyzpythonxyz'],非贪心算法,找尽可能多的满足条件的组合
d=re.findall("xyz(.*?)xyz",secret_code)
print d #输出结果为['i', 'love', 'python'],我们需要的内容用括号包裹起来
#接下来我们把密码分开两行来显示
secret_code2='''laodhfejzuwxyzhello
xyzidhlxyzpythonxyzasdwia'''
e=re.findall("xyz(.*?)xyz",secret_code2)
print e #输出结果为['idhl'],并不是我们想象中的hello world,原因是hello后面有一个换行符,正则表达式无法匹配,第一行和第二行无法衔接来查找匹配正则表达式
f=re.findall("xyz(.*?)xyz",secret_code2,re.S)
print f #输出结果为['hello\n', 'python'],其中\n换行符就是刚才无法匹配的原因
#findall和search的区别
s2="asdfxxixx123xxlovexxdfd"
a=re.search('xx(.*?)xx123xx(.*?)xx',s2).group(1)
print a #输出结果为i
a=re.search('xx(.*?)xx123xx(.*?)xx',s2).group(2)
print a #输出结果为love group后面的数字带面前面括号中的值
a=re.findall('xx(.*?)xx123xx(.*?)xx',s2)
print a #输出结果为[('i', 'love')],两个括号中的内容在一个元组中,只有这个字符串中有两个或者以上地方符合正则表达式,才会增加新的元组
#sub的使用
s="123abcssfasdfas123"
output=re.sub('123(.*?)123','i love you',s)
print output #输出结果为i love you,找到符合正则表达式的内容,将其整体换为新的内容