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()

'\\'

posted on 2018-09-06 16:17  淡淡的风景  阅读(149)  评论(0编辑  收藏  举报