梦相随1006

版权归 梦相随1006 所有,未经 https://www.cnblogs.com/xin1006 作者许可,严禁转载

导航

Python学习笔记013_正则表达式

 

Python中的正则表达式是通过 re 模块实现的.

 

通配符 .  表示除了换行以外的任何字符; 

编写正则表达式时使用  r're'  , r + 正则表达式内容

>>> import re
>>> 
>>> re.search(r'Fish.','I love FishC.com!')
<_sre.SRE_Match object; span=(7, 12), match='FishC'>
>>> # 如果要匹配 . 本身  使用  \.

\d 表示 数字字符

>>> re.search(r'\d','I love FishC.com 123 !')
<_sre.SRE_Match object; span=(17, 18), match='1'>
>>>

[] 匹配到中括号里面的任何一个字符,都算匹配成功

>>> re.search(r'[aeiou]','I love FishC.com !')
<_sre.SRE_Match object; span=(3, 4), match='o'>
>>> 

[]中可以使用 - 表示范围

>>> re.search(r'[a-z]','I love FishC.com !')
<_sre.SRE_Match object; span=(2, 3), match='l'>
>>> 

{m,n} 被匹配的次数区间

>>> re.search(r'ab{2,3}c','aabbccddacc')
<_sre.SRE_Match object; span=(1, 5), match='abbc'>
>>> 

匹配IP

>>> 
>>> # 匹配IP ,从实践可以看出几个或在一起,第一个匹配上就不再匹配第二个
>>> 
>>> 
>>> re.search(r'((25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)','192.168.1.12')
<_sre.SRE_Match object; span=(0, 12), match='192.168.1.12'>
>>> 

 

小甲鱼Python3 正则表达式 官方文档翻译讲解地址

Python3 如何优雅地使用正则表达式(详解一)http://bbs.fishc.com/thread-57073-1-1.html

Python3 如何优雅地使用正则表达式(详解二)http://bbs.fishc.com/thread-57188-1-1.html

Python3 如何优雅地使用正则表达式(详解三)http://bbs.fishc.com/thread-57207-1-1.html

Python3 如何优雅地使用正则表达式(详解四)http://bbs.fishc.com/thread-57271-1-1.html

Python3 如何优雅地使用正则表达式(详解五)http://bbs.fishc.com/thread-57317-1-1.html

Python3 如何优雅地使用正则表达式(详解六)http://bbs.fishc.com/thread-57362-1-1.html

Python3 如何优雅地使用正则表达式(详解七)http://bbs.fishc.com/thread-57438-1-1.html

Python3 正则表达式特殊符号及用法(详细列表)http://bbs.fishc.com/thread-57691-1-1.html

\ 的作用:

  1) 将普通字符变成特殊字符,   \d

      2)  解除元字符的特殊功能,    \.

      3) 引用序号对应的子组所匹配的字符串  1-99 ;如果序号以0开头或者是3位数字长度,那么不会被应用于对应的子组,而是用于匹配八进制数字所表示的ASCII码值对应的字符

>>> 
>>> re.search(r'(FishC)\1','I love FishC.com')
>>> re.search(r'(FishC)\1','I love FishCFishC.com')
<_sre.SRE_Match object; span=(7, 17), match='FishCFishC'>
>>> 

 

[] 讲解:
  它是一个字符类,除了几个特殊的字符,其它字符在里面都是普通字符,比如 - 是特殊字符  . 是普通字符

      [\n] ,匹配 \n 本身 ,[a-z-], -放在最后表示匹配-自身  [^a-z] 取反(匹配的是除了a-z之外的),如果[a-z^]表示匹配a-z和^本身

>>> re.search(r'.', 'I love FishC.com')
<_sre.SRE_Match object; span=(0, 1), match='I'>
>>> re.search(r'[.]', 'I love FishC.com')
<_sre.SRE_Match object; span=(12, 13), match='.'>
>>> 
>>> # 下面我们使用 findall 函数
>>> #findall函数是返回所有匹配的字符串,并生成列表返回
>>> re.findall(r'[a-z]','FishC.com')
['i', 's', 'h', 'c', 'o', 'm']
>>> 

* 等价于 {0,}   ,    + 等价于 {1,}   ,    ? 等价于 {0,1}

建议使用 *,+,?  他们的效率 比 {}高

 

贪婪 & 非贪婪 

Python的正则表达式默认是启用了贪婪的模式 

贪婪就是只要在符合的条件下尽可能多的匹配 

>>> 
>>> s = '<html><title> I love FishC.com</title></html>'
>>> re.search(r'<.+>',s)
<_sre.SRE_Match object; span=(0, 45), match='<html><title> I love FishC.com</title></html>'>
>>> 
>>> # 启用非贪婪 , 在表示重复的元字符后面加问号?,这时的?不代表0或1次

>>> re.search(r'<.+?>',s)
<_sre.SRE_Match object; span=(0, 6), match='<html>'>
>>> 

 \b 匹配一个单词的边界,单词被定义为 Unicode的字母数字或下划线字符

\B 与 \b相反

>>> re.search(r'\bFishC\b','I love FishC.com FishC_com FishC')
<_sre.SRE_Match object; span=(7, 12), match='FishC'>
>>> re.findall(r'\bFishC\b','I love FishC.com FishC_com FishC')
['FishC', 'FishC']
>>> 

\s 匹配Unicode中的空白字符(包括\t\r\n\f\v)以及其它空白字符

\w 匹配任何Unicode中定义的单词字符

>>> 
>>> re.findall(r'\w','我爱你 (I love you!)')
['', '', '', 'I', 'l', 'o', 'v', 'e', 'y', 'o', 'u']
>>> 

 

编译正则表达式

如果需要重复地使用某个正则表达式,那么可以先将该正则表达式编译成模式对象

使用 re.compile()方法来编译...

>>> p = re.compile(r'[a-z]')
>>> type(p)
<class '_sre.SRE_Pattern'>
>>> p.search('I love FishC.com')
<_sre.SRE_Match object; span=(2, 3), match='l'>
>>> p.findall('I love FishC.com')
['l', 'o', 'v', 'e', 'i', 's', 'h', 'c', 'o', 'm']
>>> 

 

编译标志

编译标志让你可以修改正则表达式的工作方式。在re模式下,编译标志均有两个名字:完整名和缩简写

标志                          含义

ASCII,A                    使得转义符号入\w,\b,\s和\d 只能匹配ASCII字符

DOTALL,S           使得.匹配任何符号,包括换行符

IGNORECASE,I          匹配时不区分大小写

LOCALE,L                 支持当前的语言(区域)设置

MULTILINE,M           多行匹配,影响 ^ $

VERBOSE,X(for 'extended')   启用详细的正则表达式

 

search()方法, 返回的是一个 匹配对象

可以使用匹配对象的相关方法获取匹配的内容, 如果里面有 子元组 ,group(n) ,可以获取里面的子元组内容

>>> 
>>> result = re.search(r' (\w+) (\w+)','I love FishC.com')
>>> type(result)
<class '_sre.SRE_Match'>
>>> result.group()
' love FishC'
>>> result.group(1)
'love'
>>> result.group(2)
'FishC'
>>> result.start()
1
>>> result.end()
12
>>> result.span()
(1, 12)
>>> 

 

findall()方法 在没有子组的情况下,返回匹配到的内容组成的列表,如果里面包含了子组,就会把子组内容单独返回,如果有多个子组,作为元组的形式返回各个子组内容

 

(?...)  (?开头的表示为正则表达式的扩展语法 

(?:...)  , 非捕获组 ,即该子组匹配的字符串无法从后边获取

#不是我们想要的结果
>>> re.findall(r'((25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)','192.168.1.12')
[('1.', '1', '12')]
>>> # 是我么你想要的结果,改为非捕获组
>>> re.findall(r'(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)','192.168.1.12')
['192.168.1.12']
>>> 

 

posted on 2016-08-06 18:24  梦相随1006  阅读(255)  评论(0编辑  收藏  举报