一.正则表达式
1.定义:正则表达式就是字符匹配的工具:由正则符号和普通字符组成来匹配不同规律的字符串
2.python中的正则表达式:
python中提供了了一个re模块,用来支持正则表达式
fullmatch(正则表达式,字符串) -- 用正则表达式去完全匹配字符串,
如果匹配成功返回匹配结果,失败则返回None
fullmatch(正则表达式,字符串) -- 用正则表达式去完全匹配字符串,如果
完全匹配,则返回匹配到的对象,否则返回None
python中正则表达式的写法:将正则表达式符号写在字符串中,一般在字符串中加r
3.正则表达式中的字符:
a. 普通字符:普通字符在正则表达式中就代表字符本身
b.符号:. -- 点:点出现的位置,可以匹配任意一个字符(一个点匹配一个字符)
re_str = r'a.c'
result = re.fullmatch(re_str,'abc')
print(result)
c.\w -- \w出现的位置,可以匹配字母数字下划线任意一种字符(一个\w匹配一个字符)包括了Unicode中除了ASCII码的所有编码值
re_str= r'\w\w\w'
result = re.fullmatch(re_str,'2d3')
print(result)
d.\s --匹配空白字符(空格、制表符和换行符)
re_str= r'\s\d\sr'
result = re.fullmatch(re_str,' 3 r')
print(result)
e. \d -- 匹配数字字符
re_str= r'\d\d\d'
result = re.fullmatch(re_str,'435')
print(result)
f. \b -- 检测单词的边界
注意:\b 是检测出现的位置是否是单词的边界,不会对字符进行匹配
单词边界:单词开头,单词结尾,标点符号,空白符号等(只要能将两个单词区分开)
re_str = r'hello\bworld'
re_str1 = r'hello,\bworld'
result = re.fullmatch(re_str,'hello world')
result1 = re.fullmatch(re_str,'hello,world')
print(result)
print(result1)
g. ^ -- 检测字符串开头 (在match和fullmatch中没有意义,在search和findall等中有意义)
re_str = r'^the...'
result= re.fullmatch(re_str,'thesdo')
print(result)
h. $ -- 检测字符串结尾(match和fullmatch中没有意义,在search和findall等中有意义)
re_str = r'the..$'
result = re.fullmatch(re_str,'the34')
print(result)
i.
\W:与非数字、字母、下话线匹配
\D:与非数字字符匹配
\S:与非空字符匹配
\B:检测出现位置是非单词边界
re_str= r'\d\D\s\w\Ba'
result = re.fullmatch(re_str,'9h\t_a')
print(result
j.[任意字符集] -- 匹配中括号出现的额任意一个字符
[]中的正则字符不在表示特殊意思,就是字符本身(带反斜杠的字符符号除外)
[abc] -- 匹配a,b,c,中的任意一个字符(一个中括号只能匹配一个字符)
re_str= r'\bs[sg.+d4=]'
result= re.fullmatch(re_str,'s=')
print(result)
k.[字符1-字符2] -- 字符1到字符2之间的所有支付(要求字符1的编码值要小于字符2)
[a-z] -- 匹配所有小写字母
[A-Z] -- 匹配所有大写字母
[a-zA-Z] -- 匹配所有字母
[1-7] -- 匹配数字1到7
[\u4e00-\u9fa5] -- 匹配所有中文字符
[ab-] -- 这的-表示减号本身
l: [^字符集] -- 匹配不在字符集中的任意一个字符
[^a-z] -- 匹配除了小写字母以外的任意字符
[abc^] -- 匹配a,b,c或者^中的任意一个字符
二.正则表达式匹配次数符号
a.匹配0次或者多次: *
1. * -- 匹配0次或者多次
2. a* -- a出现0次或者多次都可以匹配(连续出现)
3. \d* -- 任意数字出现0次或者多次
4. [abcd]* -- a,b,c,d中任意一个字符出现0次或者多次
5. [A-Z]* -- A到Z的任意一个大写字母出现0次或者多次
print(re.fullmatch(r'a*b','aaaaaab'))
print(re.fullmatch(r'\d*','23555'))
b.匹配1次或者多次(至少一次): +
a+ -- a至少出现一次或者多次(a是连续出现的)
print(re.fullmatch(r'a+b','aaaaaaba'))
c.匹配0次或者1次: ?
a? -- a 出现一次或者0次(''和'a'可以匹配)
a = r'[+-]?[1-9]\d*'
print(re.fullmatch(a,'-166'))
d.匹配n次: {}
{N} -- 匹配N次(a{3}:a匹配3次)
{M,N} -- 匹配M到N次(a{3,5}:匹配3、4或者5个a)
{,N} -- 匹配0到N次,即最多匹配N次
{N,} -- 匹配至少N次
print(re.fullmatch(r'a{3,}d','aaaad'))
a = r'[a-zA-Z][\da-zA-Z]{5,11}'
print(re.fullmatch(a,'w23455u5u'))
三.分子、捕获、贪婪
1.分子:条件1|条件2 -- 匹配条件1的正则表达式或者匹配条件2的正则表达式
\d{2}|[a-z] -- 匹配两个数字字符或者一个小写字母
\w\d{2} | \w{2} -- 匹配一个(数字、字母、下火线) 加 2个数字或者匹配2个字母数字下划线
注意:当条件1匹配时,就不会使用条件2匹配
练习: 写一个正则表达式,匹配所有的数字,包括正负整数小数,0
a = r'[+-]?[1-9]\d*[.]?[1-9]\d*|[+-]?0[.]\d+|0 '
print(re.fullmatch(a,'0.0'))
2.捕获和分组
a.分组 -- 即用小括号括起来,将括号中的内容作为一个整体
re_str1= r'abc(\d{3}|[a-z]{5})'
b.捕获
re.findall(正则表达式,字符串) -- 在字符串中获取正则表达式条件的所有子串,返回一个列表
注意: 在findall正则表达式中加括号,匹配按正则表达式匹配,返回只括号里面的字符串
str2 = 'asdg3556agrt2a55hhhha5%6*6h'
print(re.findall(r'a(\d+)',str2)) # ['55', '5']
3.贪婪
匹配次数后加?就是贪婪匹配: *?,+?,??,{m,n}?,{m,}?
在匹配的时候没有什么影响,在搜索的时候有贪婪,会尽量少的搜索
4.转义符号
在正则表达式中可以在有特殊意义或者特殊功能的付好钱加\来取消其特殊功能
re_str= r'\\w-\d{3}'
re_str2= r'a\+'
print(re.fullmatch(re_str,'\w-232'))
re_str = r'the...'
result = re.fullmatch(re_str,'the34t')
print(result)
四.re模块
1.compile(正则表达式) -- 将正则表达式转换成正则表达式对象,转换成对象后可以调用对象方法
re_str = r'\d*'
re_object = re.compile(re_str)
print(re.fullmatch(re_str,'2355'))
print(re_object.fullmatch('2355'))
2.fullmatch(正则表达式,字符串) -- 完全匹配,从字符串开头匹配到结尾
match(正则表达式 ,字符串) -- 不完全匹配,只匹配字符串开头
re_str= r'\d[a-z]{2}'
result1= re.fullmatch(re_str,'3ff')
print(result1)
result2 = re.match(re_str,'3ff99338')
print(result2)
3.search(正则表达式,字符串) -- 从字符串开头搜索到第一个与正则表达式先匹配的字符并返回,没有搜索到返回None
re_str1 = r'\d\w[ad]{3}'
print(re.search(re_str1,'werr2_ada87hnn44aad'))
4.split(正则表达式,字符串) -- 在字符串中用符合正则表达式的子串分割字符串,返回一个元素是字符串的列表
print(re.split(r'\d+|[+*-]+','235gdsgmkr+_jogj50-9*0ung--4hrg--i'))
5.sub(正则表达式,新子串,字符串) -- 用新子串替换字符串中符合正则表达式的子串,返回一个替换后的字符串
str1= '你妈卖嘛匹,草你妈,你个鬼儿子,fuck you'
result3 = re.sub(r'[草艹]|f\s*u\s*c\s*k|傻\s*叉','*',str1)
print(result3)
6.findall(正则表达式,字符串) -- 在字符串中找出所有符合正则表达式的子串,返回一个元素是字符串的列表
注意 :如果这个正则表达式中有一个分组,结果是列表中的每个元素
如果有两个以上的分组,结果是列表中的元祖,每个元祖中的元素是每个分组匹配到的结果
7.7.finditer(正则表达式,字符串) -- 获取字符串中满足正则表达式的内容, 返回的是一个迭代器,迭代器中的元素是匹配对象
'''
练习:自己编程实现finditer函数
def my_finditer(pp,str1):
re1= re.search(pp,str1)
while re1:
yield re1
str1 = str1[re1.end():]
re1 = re.search(pp,str1)
网友评论