import re(正则的包)
#match 从字符串的开头位置匹配,从开头可以匹配到,就获得一个正则对象,
匹配不到就返回None
1.re.match(“正则表达式”,”目标字符串”),匹配成功会返回一个正则对象,,若失败则返回一个None,re.match("asd","1asdfghh").group()失败的时候使用会报错:AttributeError: 'NoneType' object has no attribute 'group'
想查看匹配的对象用re.match("123","123asdfghh").group()
re.match("asd","asdfghh")
>>><re.Match object; span=(0, 3), match='asd'>
re.match("asd","1233asdfghh")#开头没匹配到就返回None
>>>
re.match("asd","asdfghh").group()#查看匹配的内容
>>>'asd'
判断是否匹配成功
import re
if re.match("123","123sdf"):
print(re.match("123","123sdf").group())
else:
print("没有匹配成功")
2.re.search(“正则表达式”,”目标字符串”),在目标字符串的任意位置,只会成功匹配一次就结束,不会尝试多次匹配
re.search("abs","sedeabs")
<re.Match object; span=(4, 7), match='abs'>
3..re.findall(“正则表达式”,”目标字符串”),匹配多个内容
re.findall("123","123456123345123")
['123', '123', '123']
正则表达式可以编译,可以复用,findall后面不支持.group()举个栗子:
pattern=re.compile(r"abc")
pattern.match("abc234").group()
>>> 'abc'
pattern.search("123abcdef").group()
>>> 'abc'
pattern.findall("abcdefgabc")
>>> ['abc', 'abc']
模糊匹配\d:匹配数字(digital)
\D:匹配非数字
re.search(r"\d","qwer12").group()#匹配数字
>>>'1'
re.search("\D","sdff845").group()#匹配非数字
>>> 's'
\w:匹配字母或数字
\W:匹配非字符且也是非数字的情况
re.search(r"\w","#$%wer123").group()
>>>'w'
re.search(r"\W","123#asd").group()
>>>'#'
\s:匹配一个空白字符:空格,\n\r\t
\S:匹配一个非空白字符
re.search(r"\s","#\t$123#asd").group()
>>> '\t'
re.search(r"\S","\r\n@\t$123#asd").group()
>>> '@'
z]:匹配小写字母 Z]:匹配大写字母 zA-Z]:匹配大小写字母re.search(r"[a-z]","asdADD").group()
>>>'a'
re.search(r"[A-Z]","asdADD").group()
>>>'A'
re.search(r"[a-zA-Z]","123asdDD").group()
>>> 'a'
匹配多个
+:匹配至少一个,可以多个
*:匹配0个或多个
?:匹配0个或1个
{n,m}:匹配n个或者m个之间的个数都行
re.search(r"[a-zA-Z]+","12asdDF").group()
>>> 'asdDF'
re.search(r"[a-zA-Z]*","12asdDF").group()
>>> ''
re.search(r"[a-zA-Z]{2,6}","12asdDF").group()#不确定时可以匹配范围
>>> 'asdDF'
re.search(r"\d+","12asdDF").group()
'12'
re.search(r"\D+","12asdDF").group()
>>> 'asdDF'
re.search(r"\w+","12asdDF").group()
>>> '12asdDF'
re.search(r"\d*?","a12asdDF").group()
>>>''#因为*表示0个或多个,匹配第一个a前面没有数字也是满足0个的所以返回空’’
re.search(r"\d*","12asdDF").group()
>>> '12'
re.search(r"\S*","12asdDF").group()
>>> '12asdDF'
re.search(r"\d{3}","12asd5677DF").group()#不能超过最多个数,否则会报错
>>>'567'
带有量词的情况下,正则都会进行最多元素的匹配,正则具有贪婪性
抑制正则的贪婪性,量词后面加个?就可以了
re.search(r"\d+?","12asdDF").group()
>>> '1'
.:是除了回车之外的任意字符,加个,re.S可以实现匹配回车
举个栗子:
re.search(".+","123asxc").group()
>>> '123asxc'
re.search(".+","123as \n\r\txc").group()#\n\r\t都是回车,不会匹配
>>> '123as '
re.search(".+","123as \n\r\txc",re.S).group()#加个,re.S可以实现匹配回车,S非空白字符
>>> '123as \n\r\txc'
#re.I可以忽略大小写(大写的i)
举个栗子:
re.search("as","as123df",re.I).group()#re.I可以忽略大小写
>>>'as'
re.search("as","AS123df",re.I).group()#re.I可以忽略大小写
>>>'AS'
开始和结尾的匹配,^表示开头的位置,$表示结尾
>>> re.search(r"^\d+[A-Z]+$","123ASD").group()
'123ASD'
\b:单词边界,字符串的最前面和最后面,或者前面有空白字符
举个栗子:
re.search(r"ai","rain,ai")
>>> <re.Match object; span=(1, 3), match='ai'>#这样匹配的是rain这个里面的ai,不是单词
re.search(r"\bai","rain,ai")
>>> <re.Match object; span=(5, 7), match='ai'>#这样匹配的是ai,是一个单词
re.M表示带有\n\r\t回车的字符当成多行字符去处理
举个栗子:
re.search("\d+$","123\n345\n567")
>>> <re.Match object; span=(8, 11), match='567'>#没有加re.M匹配到多行最后
re.search("\d+$","123\n345\n567",re.M)
>>> <re.Match object; span=(0, 3), match='123'>#加re.M匹配到多行最前
再举个栗子:一般findall用的多
re.findall(r"\d+$","df123\nwe345\nsdf456")
>>> ['456']
re.findall(r"\d+$","df123\nwe345\nsdf456",re.M)
>>>['123', '345', '456']
|表示或者的关系
举个栗子:
re.search(r"ab|cd","123ab")#表示ab可以cd也可以
>>> <re.Match object; span=(3, 5), match='ab'>
re.search(r"ab|cd","123cd")
>>> <re.Match object; span=(3, 5), match='cd'>
分组:在匹配的内容中,在匹配的结果中,在拿到一些需要的内容
举个栗子:
re.search(r"\d+cd","123cd")
>>><re.Match object; span=(0, 5), match='123cd'>
re.search(r"(\d+)cd","sdf123cd345")#(\+d)就是分组,在正则表达式里面加上一个()
>>><re.Match object; span=(3, 8), match='123cd'>
re.search(r"(\d+)cd","sdf123cd345").group(1)#分组后用group的坐标来取值
>>>'123'
re.search(r"(\d+)cd","sdf123cd345").group(0)
>>>'123cd'
re.search(r"ad(\d+)","sad12ad45")
<re.Match object; span=(1, 5), match='ad12'>
re.search(r"ad(\d+)","sad12ad45").group(0)
>>> 'ad12'
re.search(r"ad(\d+)","sad12ad45").group(1)
>>> '12'
re.search(r"(a)(d)(\d+)","sad12ad45").group(0)
>>> 'ad12'
re.search(r"(a)(d)(\d+)","sad12ad45").group(1)#表示结果要第1个括号的,而且可以嵌套,一个括号一个分组
>>> 'a'
re.search(r"(a)(d)(\d+)","sad12ad45").group(2)#表示结果要第2个括号的
>>> 'd'
re.search(r"(a)(d)(\d+)","sad12ad45").group(3)#表示结果要第3个括号的
>>> '12'
re.search(r"((a)(d)(\d+))","sad12ad45").group(0)
小练习:
匹配手机号:
re.findall(r"\d{11}","qwwww15678904567sdf17834561230")
匹配年月日匹配单词
re.findall(r"[a-zA-Z]+","haha !$you are a good boy!是的")
>>>['haha', 'you', 'are', 'a', 'good', 'boy']
len(re.findall(r"[a-zA-Z]+","haha !$you are a good boy!是的"))#查询单子个数
>>>6
匹配ip:xxx.xxx.xxx.xxx4段数字,3个点re.findall(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}","123.345.4.34")
>>> ['123.345.4.34']