正则
正则表达式是计算机科学的一个概念,正则表通常被用来检索、替换那些符合某个模式(规则)的文本。也就是说使用正则表达式可以在字符串中匹配出你需要的字符或者字符串,甚至可以替换你不需要的字符或者字符串。
正则(不是python特有的) 匹配字符串,其他语言也有正则表达式
需求:输入字符,判断字符串有无python
import re
a=input("输入:")
b=re.search("python",a)#搜寻匹配,匹配是第一个
if bool(b) ==True:
print("ok")
else:
print("no")
需求:输入字符,判断字符串是否是5-11位数字
qq=input("输入:")
b=re.search("[0-9]{5,11}",qq) #(规则,对象)
if b:
print("ok")
else:
print("no")
'''
元字符
常用特殊字符:
. ^ $ * + ? {} [] \ | ()
大多数字母和字符会匹配它们自身,有少数特殊字符我们称为元字符,它们不能匹配自身
子组匹配和模式重复次数等
.
匹配除换行符之外的所有的字符
>>> re.search(".","\nasfsdfdsaf") #去掉了\n
<_sre.SRE_Match object; span=(1, 2), match='a'>
\d
匹配0~9的数字
>>> re.search("\d","asf2sdfdsaf") #查询第一个数字
<_sre.SRE_Match object; span=(3, 4), match='2'>
>>> re.findall("\d","asf2sdf4dsa3f") #查询所有的
['2', '4', '3']
\s
# 匹配任意的空白符,包括空格,制表符(Tab),换行符等
>>> re.findall("\s","\n \t asss")
['\n', ' ', ' ', '\t', ' ', ' ']
\w
匹配字母或数字或下划线或汉字等
>>> re.findall("\w","adwo__55+%?")
['a', 'd', 'w', 'o', '_', '_', '5', '5']
\b
表示单词的边界 #除了字母下划线和数字外,其他都算边界
>>> re.findall(r"\bapple\b","apple apple") # r转义
['apple', 'apple']
\.
表示匹配点号本身
>>> re.findall(r"\.",".apple. apple")
['.', '.']
python正则表达式关键字字符转义
re.findall(r"\\b",r"55apple\b") #正则表达转义 ,需要加上r 和\
\D
、\S
、\W
、\B
是与小写的相反的作用
\D
>>> re.findall(r"\D","123ASDF")
['A', 'S', 'D', 'F']
\S
>>> re.findall(r"\S","\t \n aaa")
['a', 'a', 'a']
\W
>>> re.findall(r"\W","\t \n aaa")
['\t', ' ', '\n', ' ']
^
脱字符,匹配输入字符串的开始的位置
>>> re.findall(r"^adc","adcefg") #adc开头的
['adc']
$
匹配输入字符串的结束位置,解除元字符的特殊功能例
>>> re.findall(r"efg$","adcefg") #efg结尾的
['efg']
匹配次数
{M,N}
M和N 为非负整数,其中M<=N 表示前面的匹配M~N次
>>> re.findall(r"\d{1,3}","22db44ef555g1666")
['22', '44', '555', '166', '6']
{M,}
表示需要匹配M次 以上
>>> re.findall(r"\d{2,}","22db44ef555g1666")
['22', '44', '555', '1666']
{,N}
等价于{0~N}
>>> re.findall(r"\d{,2}","22db44ef555g1666") #注意这里最后会加上一个空格
['22', '', '', '44', '', '', '55', '5', '', '16', '66', '']
{N}
表示需要匹配N次
>>> re.findall(r"\d{2}","22db44ef555g1666")
['22', '44', '55', '16', '66']
*
匹配前面的子表达式零次或多次,等价于{0,}
>>> re.findall(r"\d*","22db44ef555g1666")
['22', '', '', '44', '', '', '555', '', '1666', '']
+
匹配前面的子表达式一次或多次,等价于{1,}
>>> re.findall(r"\d+","22db44ef555g1666")
['22', '44', '555', '1666']
?
匹配前面的子表达式零次或一次,等价于{0,1}
注:*?
、+?
、{n,m}?
贪婪与懒惰
>>> re.findall(r"\d?","22db44ef555g1666")
['2', '2', '', '', '4', '4', '', '', '5', '5', '5', '', '1', '6', '6', '6', '']
>>> re.findall(r"\d*?","22db44ef555g1666") # *是 0到多次 ?号是0到1次 结果就是匹配0次 求交集
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
>>> re.findall(r"\d+?","22db44ef555g1666") #+号是1到多次 ?号是0到1次 结果就是1次 求交集
['2', '2', '4', '4', '5', '5', '5', '1', '6', '6', '6']
>>> re.findall(r"\d{2,5}?","22db44ef555g1666") #{2,5}是2到5次 ?号是0到1次 最小取值是2次
['22', '44', '55', '16', '66']
子组匹配
[ ]
字符类,将要匹配的一类字符集放在[]里面
[ . ? * ( ) {} ]
匹配里面的这些符号
[0-9]
匹配0到9的数字相当于\d
需求:所有数字
>>> re.findall(r"[0-9]","22db44ef5") #所有数字
['2', '2', '4', '4', '5']
[^\d]
匹配除数字以外的字符,相当于\D
>>> re.findall(r"[^\d]","22db44ef5AB")
['d', 'b', 'e', 'f', 'A', 'B']
>>> re.findall(r"[^\d]{2}","22db44ef5AB") #非数字次数为2的
['db', 'ef', 'AB']
[a-z]
匹配所有的小写字母
>>> re.findall(r"[a-zA-Z]","22db44ef5AB") #所有字母
['d', 'b', 'e', 'f', 'A', 'B']
[^a-z]
# 匹配非小写字母
>>> re.findall(r"[^a-z]{2}","22db44ef5AB")
['22', '44', '5A']
|
相当于或(or)分支条件
A | B
匹配字母A或者B 与[AB]是一样的
第一种方式:
>>> re.findall(r"b|a","22db44ef5ABa")
['b', 'a']
第二种方式:
>>> re.findall(r"[ba]","22db44ef5ABa")
['b', 'a']
()
分组,将要匹配的一类字符集放在()组成一个小组
>>> re.findall(r"(db)","22db44ef5ABa")
['db']
>>> re.findall(r"(db)*","22db44ef5ABadb")
['', '', 'db', '', '', '', '', '', '', '', '', 'db', '']
re模块
re模块的常用方法
re.compile()
编译正则表达式为模式对象
>>> re.compile(r"\d")
re.compile('\\d')
match()
判断一个正则表达式是否从开始处匹配字符串
>>> print(re.match(r"\d","b123a")) #匹配开头,相当于脱字符
None
search() 遍历字符串,找到正则表达式匹配的第一个位置
findall() 遍历字符串,找到正则表达式匹配的所有位置并以列表的形式返回
sub() 替换 类似于字符串中 replace() 方法
>>> re.sub("i","o","pythin") #默认替换所有
'python'
>>> re.sub("i","o","pythin pythin pythin pythin",3) #指定次数
'python python python pythin'
查看匹配对象中的信息
- group() 返回匹配到的字符串
- star() 返回匹配的开始位置
- end() 返回匹配的结束位置
- span() 返回一个元组表示匹配位置(开始,结束)
>>> c=re.search(r"\d","b35f3")
>>> c.group()
'3'
>>> c.start()
1
>>> c.end()
2
>>> c.span()
(1, 2)
'''