正则表达式
主要三个方法
re.findall("pattern",str)
re.match("pattern",str)
re.search("pattern",str)
pattern为正则表达式,str是需要匹配的字符串
最简单正则表达式的运用
import re
a='12654511554611615161611'
r=re.findall('6',a) #判断字符串中是否有6
if len(r)>0:
print("字符串包含6")
else:
print(None)
print(r)
#运行结果:
字符串包含6
['6', '6', '6', '6', '6']
findall 找到全部的6 并且返回的是一个列表
ps:
正则表达式的灵魂是规则 要写有意义的
以上的虽然也可以称为正则表达式 但是却是毫无意义, 你说呢?
元字符和普通字符
#试试提取除字符串中的数字和字母
import re
a="as65f65as6fs65f6s66sf6s6f"
r=re.findall("d",a) #/d表示匹配一个数字字符。等价于 [0-9]。 大写D表示 没有数字 即非数字
print(r)
r=re.findall("D",a)
print(r)
#字符串是普通字符 #d 这样的叫元字符d
运行结果:
['6', '5', '6', '5', '6', '6', '5', '6', '6', '6', '6', '6']
['a', 's', 'f', 'a', 's', 'f', 's', 'f', 's', 's', 'f', 's', 'f']
字符集
import re
s="abc,acc,adc,aec,afc,ahc"
r=re.findall("a[cf]c",s) #取出 中间是c 或者 f
d=re.findall("a[^cf]c",s)
b=re.findall("a[c-f]c",s)
print(r)
print(d)
print(b)
结果为:
['acc', 'afc']
['abc', 'adc', 'aec', 'ahc']
['acc', 'adc', 'aec', 'afc']
#出现在[]内的是或的关系 内容+^表示反意 "-" 表示到
概况字符集 d,D >>>[-9] w 表示 匹配字符和数字 下划线 >>>不能匹配特殊符号W 表示反意
#s 表示空白字符 S 非空白字符
# .匹配除换行符
之外其他所有字符
字符集和概括字符集 都是只能匹赔单一的字符 所以引出了后面成组的概念
#数量词
#成组 用多个[]
import re
a= "python 1111jave678php"
r = re.findall('[a-z]{3,6}',a) #中括号后+花括号 成组表示
print(r)
结果为:
['python', 'jave', 'php']
#意思是什么 a-z的字母这样的字母最少我取3个 最多我取6个 贪婪模式下 反之呢
import re
a= "python 1111jave678php"
r = re.findall('[a-z]{3,6}?',a) #中括号后+花括号 成组表示
print(r)
结果为:
['pyt', 'hon', 'jav', 'php']
#意思是什么 a-z的字母这样的字母最少我取3个就够了 满足3 我就够了
#贪婪和非贪婪 当数量词在某范围内将尽可能多的满足条件的内容输出 非贪婪 满足条件就输出
# *号键 匹配*前面的字符0次或者无限多次
#+号键 匹配+前面的字符1次或者无限多次
#?号键 匹配0次或者一次 会去多余n
import re
a = "pytho0python1pythonn2"
r = re.findall('python?',a) #?前面是0个n
print(r)
运行结果为:
['pytho', 'python', 'python']
#可以看出什么 ?前面是n 我匹配的python 可以没有n 可以有一个n 如果有多个n那么我会去掉他
import re
a = "pytho0python1pythonn2"
r = re.findall('python*',a)
print(r)
运行结果为:
['pytho', 'python', 'pythonn']
*前面是n 匹配*前面的字符0次或者无限多次
import re
a = "pytho0python1pythonn2"
r = re.findall('python+',a)
print(r)
运行结果为:
['python', 'pythonn']
+前面是n 匹配依此 或者无限多次的这个字符
边界匹配
import re
qq = "100001"
r = re.findall("d{4,8}",qq) #4-8是合法的 上面是寻找
print(r)
qq="1000000000000000000001"
r = re.findall("^d{4,8}$",qq) #运用边界符匹配整个字符串是否满足 条件 字符串前"^"
print(r) #后面$
运行结果为:
['100001']
[]
#前者 匹配数字 4-8个都可以 我很贪婪我都匹配下来
#后者 匹配非数字4-8个 我很贪婪 但是很抱歉我没有找到数字
组
import re
a="pythonpythonpythonpythonpython"
r=re.findall("(python){3}",a)
print(a)
结果为:
pythonpythonpythonpythonpython
#我匹配的是python 这些字母开头的 匹配三个就满足条件 是且的关系 好几个三个 返回了一个字符串
# () 表示组 内容是且的关系 正则表达式中可以有多个组 组后是数量词
# [] 内容是或的关系
匹配模式参数
import re
language="PythonC#
JavePHP"
#4-8
r = re.findall("c#.{1}",language,re.I|re.S) #用小写c匹配C# 可以用re.I 忽略大小写 多个模式用‘|’
print(r) # re.S 匹配所有字符
#运行结果:
['C#
']
总结出什么?re.findall("pattern",str,模式参数)
re.sub 正则替换
import re
def civent(value):
return 'go'
language="PythonC#JavePHPC#JaveC#JaveC#Jave"
r = re.sub("C#",civent,language,1) #count 表示替换的最大次数 0 全部替换
# 函数可以做第二个参数也可以是要替代的字符串
print(r)
运行结果:
PythongoJavePHPC#JaveC#JaveC#Jave
#将一个C#改为了go
#把函数作为参数传递
import re
s = "A8C3721D86"
def covent(value): #value 是个对象
mathed=int(value.group()) #成组出现
if mathed >=6:
return '9'
else:
return '0'
r=re.sub("d",covent,s)
print(r)
运行结果:
A9C0900D99
将大于等于6的数字返回9,否则返回0
#search与match 函数
import re
s = "83C72D1D8E67"
r=re.match("d",s) #从开始匹配
#match 尝试从字符串的首字母开始匹配,如果matcch没有找到相应的匹配结果 将返回一个None
print(r)
r1=re.search("d",s)
#search是搜素整个字符串,直到找到第一个满足正则表达式的结果,然后将匹配的结果返回
print(r1)
#一旦匹配成功立刻停止搜素
#group的概念
import re
s="life is short, i use python"
r=re.search("life(.*)python",s) #取 life—pytho中的内容
print(r.group(1))