正则表达式
定义:正则表达式是一个特殊的字符序列,一个字符串是否与我们所设定的这样的字符序列相匹配。快速检索文本、实现一些替换文本的操作。
1、检查一串数字是否是电话号码;
2、检测一个字符串是否符合email;
3、把一个文本里指定的单词替换为另外一个单词
一、查找 findall
import re
a = 'c|c++|java|python'
## print(a.index(‘python’)> -1 )
## print('python' in a)
re.findall('python',a) # re.findall('正则表达式',a)
if len(r) > 0:
print("字符串中包含python")
b = 'c7c++7java7python'
rr = re.findall('\d',a)
print(rr)
具体字符集负责确定开始和结尾,抽象字符集用来匹配。
## 概括字符集:
\w 匹配所有的单词字符(字符和数字[A-Za-z0-9和_])
\W 匹配非单词字符
\d 匹配所有的数字
\D 匹配所有的字符
. 匹配除换行符以外其它所有的字符
## 数量词
c = 'python 1111java678php'
rrr = re.findall('[a-z]{3}',a) #{3}相当于前面字符集乘以数量集
print(rrr) #['pyt','hon','jav','php']
rrr = re.findall('[a-z]{3,6}',a) #{3}相当于前面字符集乘以数量集3到6之间的数字
print(rrr) #['python','java','php']
#python倾向于贪婪匹配,当有3到6这个选择时,python会尽量选择大的6来匹配
# 如果python想要启动非贪婪的模式匹配,在数量词后面加上?
rrrr = re.findall('[a-z]{3,6}?’,a)
print(rrrr) #['pyt','hon','jav','php']
# * 表示对它前面的那个字符匹配0次或者无线多次
# + 表示匹配1次或者无线多次
# ? 表示匹配0次或者1次 可以拿来去重
#如果前面有个范围,再加?表示的是非贪婪的意思;如果前面是固定字符表示的是数量词的意思
d = re.findall("python{1,2}?",a)
print(d) # [python,python]
## 边界匹配
qq = '10000001'
r = re.findall('^\d{4,8}$',qq)
# ^表示从字符串的开头进行匹配,$表示从字符串的结尾匹配
## 多个字符的重复,用组的概念,一个括号就是一个组
# []里的数字是或的关系,()里的数字表示的是且的关系
r = re.findall('(python){3}',a)
## findall的第三个参数表示模式
language = 'PythonC#\nJavaPHP'
r = re.findall('c#.{1}',language,re.I | re.I)
re.I表示忽略大小写,第三个参数也可以填入多个模式
re.S 改变.号的行为,使.号能匹配所有换行符
re.I | re.I 表示两种模式都支持
6
二、替换 replace
import re
language = 'PythonC#\nJavaC#PHPC#'
r = re.sub('C#','GO',language,0 ) #0表示无限制匹配下去,1表示只匹配第一个
def convert(value):
matched = value.group()
return '!!' + matched + '!!'
rr = re.sub('C#', convert, language)
language = language.replace('C#','GO') #字符串的替换
print(language)
print(r)
## 示例一
import re
s = 'A8C3621D89'
def convert(value):
matched = valued.group()
if int(matched) >= 6:
return '9' #不能直接传数字
else:
return ‘0’
r = re.sub('\d', convert,s)
三、re.match和re.search函数(可以不看,findall都可以满足要求)
match和search都只匹配一次
import re
s = 'A83C72D1D8E67'
r = re.match('\d',s) #从字符串的首字母开始匹配,None
print(r)
r1 = re.search('\d',s) #搜索整个字符串,直到他找到第一个满足字符串的结果
print(rq)
## 获取字符中间的内容
### 实现方法一
import re
s = 'life is short ,i use python'
r = re.search('life(.*)python', s)
# print(r.group(0)) # group(0)表达的是完整的结果,
print(r.group(1)) #输出结果 is short ,i use,返回的是元祖
### 实现方法二,findall 的实现
r = re.findall('life(.*)python' , s)
print(r.group(1)) #输出:['is short,i use'],返回的是列表
注意:空格不在单词字符里