1.元字符
2.re模块
正则
正则表达式是计算机科学的一个概念,正则表通常被用来检索、替换那些符合某个模式(规则)的文本。也就是说使用正则表达式可以在字符串中匹配出你需要的字符或者字符串,甚至可以替换你不需要的字符或者字符串。
####1.元字符
. ^ $ * + ? {} [] \ | ()
#大多数字母和字符会匹配它们自身,有少数特殊字符我们称为元字符,它们不能匹配自身
#子组匹配和模式重复次数等
. # 匹配除换行符之外的所有的字符
\d # 匹配0~9的数字
\s # 匹配任意的空白符,包括空格,制表符(Tab),换行符等
\w # 匹配字母或数字或下划线或汉字等
\b # 表示单词的边界
\. # 表示匹配点号本身
\D、\S、\W、\B # 是与小写的相反的作用
^ # 脱字符,匹配输入字符串的开始的位置
$ # 匹配输入字符串的结束位置,解除元字符的特殊功能例
#匹配次数
{M,N} # M和N 为非负整数,其中M<=N 表示前面的匹配M~N次
{M,} # 表示需要匹配M次 以上
{,N} # 等价于{0~N}
{N} # 表示需要匹配N次
* # 匹配前面的子表达式零次或多次,等价于{0,}
+ # 匹配前面的子表达式一次或多次,等价于{1,}
? # 匹配前面的子表达式零次或一次,等价于{0,1}
#注:*?、+?、{n,m}? 贪婪与懒惰
#子组匹配
[ ] # 字符类,将要匹配的一类字符集放在[]里面
#例如:
[ . ? * ( ) {} ] # 匹配里面的这些符号
[0-9] # 匹配0到9的数字相当于\d
[^\d] # 匹配除数字以外的字符,相当于\D
[a-z] # 匹配所有的小写字母
[^a-z] # 匹配非小写字母
| # 相当于或(or)分支条件
#例如:
A | B # 匹配字母A或者B 与[AB]是一样的
#分组
() #分组,将要匹配的一类字符集放在()组成一个小组
2.re模块
#re模块的常用方法
re.compile() # 编译正则表达式为模式对象
match() # 判断一个正则表达式是否从开始处匹配字符串
search() # 遍历字符串,找到正则表达式匹配的第一个位置
findall() # 遍历字符串,找到正则表达式匹配的所有位置并以列表的形式返回
sub() # 替换 类似于字符串中 replace() 方法
#查看匹配对象中的信息
group() # 返回匹配到的字符串
star() # 返回匹配的开始位置
end() # 返回匹配的结束位置
span() # 返回一个元组表示匹配位置(开始,结束)
3 扩展
分组() ,用一个括号括起来
子模式的匹配(把匹配到的组,当作匹配规则)
找出来的是一个元组
(完整匹配,组1,组2,…)
例子:
import re
string = '啦啦啦<span><h1>醉卧沙场君莫笑,古来征战几人回</h1></span>嘻嘻嘻啦啦啦<div><a>一骑红尘妃子笑,无人知是荔枝来</a></div>嘻嘻嘻'
pattern = re.compile(r'(<(\w+)><(\w+)>.*</\3></\2>)')
# ret = pattern.findall(string)
ret = pattern.search(string)
print(ret)
print(len(ret.groups()))
print(ret.groups())
print(ret.group()) #默认的下标是1
print(ret.group(1)) # 正则下标是从1开始的
print(ret.group(2))
print(ret.group(3))
运行结果:
<_sre.SRE_Match object; span=(3, 40), match='<span><h1>醉卧沙场君莫笑,古来征战几人回</h1></span>'>
3
('<span><h1>醉卧沙场君莫笑,古来征战几人回</h1></span>', 'span', 'h1')
<span><h1>醉卧沙场君莫笑,古来征战几人回</h1></span>
<span><h1>醉卧沙场君莫笑,古来征战几人回</h1></span>
span
h1
# 正则、re模块
#回忆
'''
1.列表推导式 li = [i for i in range(10)]
迭代器 __iter__ __next__、
生成器 yield。 next() __next__()。 暂停
2. 模块 、 包
py文件。 import , from random import randint
第三方模块: 同目录, import
不同目录 sys.path.append() -> import
包, 多个py文件
'''
# 正则 (不是python特有的) 匹配字符串
##需要,输入字符, 判断字符串有无python
'''
a = input('输入:')
b = 'python'
if b in a:
print('OK')
else:
print('NO')
'''
import re
'''
a = input('输入:')
b = re.search('python',a) # 搜寻匹配,匹配到第一个
if bool(b) == True:
print('OK')
else:
print('NO')
'''
#例子 需求:判断QQ (5-11) 位
qq = input('输入QQ:')
b = re.search('[0-9]{5,11}',qq) # ( 规则, 对象 )
if b:
print('OK')
else:
print('NO')
## 1.元字符 (有了特殊意义)
' . ^ $ * + ? {} [] \ | () '
# . 匹配除换行符之外的所有的字符
re.search('.','asdfbdf')
re.search('.','\nsdfbdf')
# \d 匹配0~9的数字
re.search('\d','df1sdf2') #
re.findall('\d','df1sdf2') #查询所有,返回list
# \s 匹配任意的空白符,包括空格,制表符(Tab),换行
re.findall('\s',' \n \t aaasss')
# \w 匹配字母或数字或下划线或汉字等
re.findall('\w','ad我_55-+%?')
#\b # 表示单词的边界 : 特殊字符 空格 末尾
re.findall('\bapple\b','apple apple') ## 不会匹配,
re.findall(r'\bapple\b','apple apple') # r 取消字符串的传义
# \. 正则里面 如何取消转义
re.search('\.','asdfbdf') #取消 元字符的转义 <_sre.SRE_Match object; span=(7, 8), match='.'>
re.findall(r'\\b',r'apple++\b') # ['\\b']
#\D、\S、\W、\B # 是与小写的相反的作用
#\D \d
re.findall(r'\D','123abc') #['a', 'b', 'c']
re.findall(r'\S','\t \n aaa') #['a', 'a', 'a']
re.findall(r'\W','\t \n aaa') #['\t', ' ', '\n', ' ']
re.findall(r'\Baa\B','\t \n aa aaaaa') #['aa']
#^ # 脱字符 匹配输入字符串的开始的位置
re.findall(r'^abc','abcefg')
#$ 匹配输入字符串的结束位置
re.findall(r'g$','bcefg')
##匹配次数 {M,N}
re.findall(r'\d{1,3}','22bc44ef555g1') #['22', '44', '555', '1']
#{M,} 表示需要匹配M次 以上
re.findall(r'\d{2,}','22bc44ef555g1')
#{,N} 0-N
re.findall(r'\d{,2}','22bc44ef555g1') #匹配次数为0,末尾加一个None
#['22', '', '', '44', '', '', '55', '5', '', '1', '']
# {N} # 表示需要匹配N次
re.findall(r'\d{2}','22bc44ef555g1')
#['22', '44', '55']
# * 表达式零次或多次,等价于{0,}
re.findall(r'\d*','22bc44ef555g1')
['22', '', '', '44', '', '', '555', '', '1', '']
# + 匹配前面的子表达式一次或多次,等价于{1,}
re.findall(r'\d+','22bc44ef555g1')
#['22', '44', '555', '1']
#? 匹配前面的子表达式零次或一次,等价于{0,1}
re.findall(r'\d?','22bc44ef555g1')
#['2', '2', '', '', '4', '4', '', '', '5', '5', '5', '', '1', '']
######不要 次数混着用
# *?、+?、{n,m}?
#*?
re.findall(r'\d*?','22bc44ef555g1') # 0次
# +?
re.findall(r'\d+?','22bc44ef555g1')
#['2', '2', '4', '4', '5', '5', '5', '1']
#{n,m}? #取小值
re.findall(r'\d{2,3}?','22bc44ef555g1')
#['22', '44', '55']
#子组匹配 [ ] , 只要满足任何一个,就可以匹配
re.findall(r'[a-zA-Z]','fff2mi4AZ') #所有字母
re.findall(r'[a-zA-Z\d]','fff2mi4AZ') #所有字母 、数字
re.findall(r'[a-zA-Z\d]{2}','fff2mi4AZ')
## [] 里面 存在 ^, 代表取反
re.findall(r'[^a]','abc') # 非a
# | 或
re.findall(r'b|a','abc')
re.findall(r'[ba]','abc')
#分组 ()
>>> re.findall(r'(abc)','abc bac kkk')
['abc']
>>> re.findall(r'(abc)*','abc bac kkk')
['abc', '', '', '', '', '', '', '', '', '']
##2.re模块
#re.compile() # 编译正则表达式为模式对象
>>> a = re.compile(r'\d')
>>> a.findall('56654bh11')
['5', '6', '6', '5', '4', '1', '1']
#match() 判断一个正则表达式是否从开始处匹配字符串,相当于^
>>> print(re.match(r'\d+','123a').group())
123
>>> print(type(re.match(r'\d+','123a').group()))
<class 'str'>
#search() # 遍历字符串,找到正则表达式匹配的第一个位置
>>> re.search(r'\d','b35f3')
<_sre.SRE_Match object; span=(1, 2), match='3'>
>>> re.findall(r'\d','b35f3')
['3', '5', '3']
#sub() # 替换 类似于字符串中 replace() 方法
>>> re.sub('i','o','pythin pythin pythin pythin')
'python python python python'
>>> re.sub('i','o','pythin pythin pythin pythin',3)
'python python python pythin'
>>> re.sub('\d','a','psdf234546567')
'psdfaaaaaaaaa'
#查看匹配对象中的信息
c = re.search(r'\d','b35f3')
c.group()
c.start()
c.end()
c.span()
>> import re
>>> c = re.search(r'\d','b35f3')
>>> c.group()
'3'
>>> c.groups()
()
>>> c.span()
(1, 2)
>>> c
<_sre.SRE_Match object; span=(1, 2), match='3'>
>>> c.start()
1
>>> c.end()
2