python 正则表达式
正则表达式(re---regular expression)
1.作用:精确匹配或者模糊匹配
比如:匹配所有日志中的ip,匹配所有的响应时间。
2.match从开头匹配
正则表达式的写法
>>> import re---引入正则的包
>>> re.match(r'1','1abc')---使用mtch匹配
>>> import re
>>> re.match(r'1','1abc')
<_sre.SRE_Match object; span=(0, 1), match='1'>
>>> print(re.match(r'1','abc'))
None
查看类型
>>> type(re.match(r'1','1abc'))
<class '_sre.SRE_Match'>
>>>
匹配0-9范围内的数字。\d表示digit
>>> print(re.match('\d','9abc'))
<_sre.SRE_Match object; span=(0, 1), match='9'>
>>> print(re.match('\\d','9abc'))
<_sre.SRE_Match object; span=(0, 1), match='9'>
>>>
3.search是从整个字符串任意位置取一位
>>> re.search(r'\d','abcd1ed')
<_sre.SRE_Match object; span=(4, 5), match='1'>
>>>
group()可以打印所有正则表达式匹配的内容---这个是匹配1个数字
>>> re.search(r'\d','abcd1ed').group()
'1'
>>> re.search(r'\d+','abcd12ed').group()----匹配多个数字,后面使用+
'12'
把所有匹配的内容打印出来。findall可以实现多个结果的匹配
>>> re.findall(r'\d','a1b2c3d4')
['1', '2', '3', '4']
匹配一个非数字
>>> re.search(r'\D','1232R4AADFDa').group()
'R'
>>>
匹配多个非数字
>>> re.search(r"\D+","12343abc123ed").group()
'abc'
匹配数字和英文
>>> re.search(r"\w+","113eddd").group()
'113eddd'
匹配非数字和字母
>>> re.search(r"\W+","113eddd!$EDDD").group()
'!$'
匹配空白--空白包括\n \t \r空格
>>> re.search(r"\s+","113eddd \n\t").group()
' \n\t'
\S表示匹配非空白
>>> re.search(r"\S+","113eddd \n\t").group()
'113eddd'
+表示匹配1个或多个
*表示匹配0个或多个
正则表达式的贪婪性:尽量多匹配
>>> re.match(r'\w*','abc').group()
'abc'
这段' abc'.''中开头的是一个空格,match要求''中第一个字符就需要匹配上,符合正则的规则。所以报错了
>>> re.match('r\w*',' abc').group()
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module>
re.match('r\w*',' abc').group()
AttributeError: 'NoneType' object has no attribute 'group'
>>> print(re.match(r'w','abc'))
None
>>> print(re.match(r'w','abc').group())
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
print(re.match(r'w','abc').group())
AttributeError: 'NoneType' object has no attribute 'group'
>>>
非贪婪模式:在 + * 后面加上?
>>> re.match(r'\w+?','abc').group()
'a'
贪婪模式
>>> re.match(r'\w+','abc').group()
'abc'
>>>
限制最小匹配次数,加了?就是最小匹配。*表示匹配0次或者多次,'abc'中第一个是a.不符合条件。匹配结果是空. \w和*的范围重复了
>>> re.match(r"\w*?","abc").group()
''
改一下范围就行了
‘>>> re.match(r"\w+","abc").group()
'abc’
指定匹配内容的具体个数
匹配4个a
>>> re.search(r'a{4}','aaaa').group()
'aaaa'
匹配3个a
>>> re.search(r'a{1,3}','aaaa').group()
'aaa'
加个?限制正则的贪婪性
>>> re.search(r'a{1,3}?','aaaa').group()
'a'
>>> re.search(r'a{1,3}','aa').group()
'aa'
如果被匹配的''中个数少了,会匹配不上
>>> re.search(r'a{4}','aa').group()
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
re.search(r'a{4}','aa').group()
Attribute
如果被匹配的''中个数多了,可以正常匹配
>>> re.search(r'a{4}','aaaaaaa').group()
'aaaa'
判断字符串中是否有数字
>>> s='12af'
>>> if re.search(r'\d',s):
print('字符串有数字')
else:
print('字符串中没有数字')
字符串有数字
>>>
练习
判断一个字符串中是否有连续的5个数字
import re
s='12456af'
if re.search(r'\d{5}',s):
print('字符串有连续的5个数字')
else:
print('字符串中没有数字')
指定一个字母的范围----|是与的关系
>>> re.search(r'ab|cd','abc').group()
'ab'
[]是或的关系
>>> re.search(r'[ab]','abc').group()
'a'
?匹配0次或者1次
>>> s='1abc'
>>> re.match(r'1?',s).group()
'1'
>>> re.match(r'1?','abc').group()
''
匹配1个
>>> re.match(r"\d?","1233abc").group()
'1'
匹配多个
>>> re.match(r"\d*","1233abc").group()
'1233'
正则表达式中使用()的方式叫做分组
>>> re.search(r'a(\d+)c','a11243c')
<_sre.SRE_Match object; span=(0, 7), match='a11243c'>
>>> re.search(r"a(\d+)c","a11243c").group(1)
'11243'
匹配第1个()中的值
>>> re.search(r"(a)(\d+)(c)","a11243c").group(1)
'a'
匹配第2个()中的值
>>> re.search(r"(a)(\d+)(c)","a11243c").group(2)
'11243'
匹配第3个()中的值
>>> re.search(r"(a)(\d+)(c)","a11243c").group(3)
'c'
re.match(r"1","1b") 匹配对象,匹配到后,就不在向后匹配了
re.match(r"1","0b") None,第一个就没匹配上,就不在向后匹配了
re.search(r"1","ab1d") 匹配对象,就不在向后匹配了
re.search(r"1","abcd") None,把所有的字符串内容扫描一遍
re.search(r"\d+","ab113d") 匹配对象113,就不在向后匹配了
re.I表示忽略大小写
>>> re.match(r"a","Abc",re.I)
<_sre.SRE_Match object; span=(0, 1), match='A'>
>>> re.search(r'.','abcd').group()
'a'
>>> re.search(r'.','2abcd').group()
'2'
>>> re.search(r'.','\n2abd').group()
'2'
>>> re.search(r'.','\nabd').group()
'a'
>>> re.search(r'.',' abd').group()
' '
>>> re.match(r'\\','\\').group()
'\\'