您的位置:首页 > 编程语言 > Python开发

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

2016-08-06 18:24 495 查看
[b]Python中的正则表达式是通过 re 模块实现的.[/b]

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

编写正则表达式时使用 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

[b]\ 的作用:[/b]

  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'>
>>>


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

[\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函数是返回所有匹配的字符串,并生成列表返回
>>>[b] re.findall(r'[a-z]','FishC.com'[/b][b])[/b]
['i', 's', 'h', 'c', 'o', 'm']
>>>


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

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

[b]贪婪 & 非贪婪 [/b]

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>'>
>>>
>>> #[b] 启用非贪婪 , 在表示重复的元字符后面加问号?,这时的?不代表0或1次[/b]

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


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

[b]\B 与 \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']
>>>


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

[b]\w 匹配任何Unicode中定义的单词字符[/b]

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


[b]编译正则表达式[/b]

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

使用 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']
>>>


[b]编译标志[/b]

编译标志让你可以修改正则表达式的工作方式。在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)
>>>


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



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

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

#不是我们想要的结果
>>> 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']
>>>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: