一.预备知识正则
1.正则介绍
Python 中的正则,本质上是嵌入在Python中的一种微小的、高度专业化的编程语言,可通过
re
这个内置模块获得。
正则表达式模式几乎和 shell 中的一样,更接近grep -P
的效果,因为 Python 中的re
模块提供的是类似
Perl 语言中的正则表达式。 正则表达式模式会被编译成一系列字节码,然后由用 C 编写的匹配引擎执行。
2.陷阱
友情提示:
正则表达式语言相对较小且受限制,因此并非所有可能的字符串处理任务都可以使用正则表达式完成。
还有一些任务 可以 用正则表达式完成,但表达式变得非常复杂。 在这些情况下,你最好编写 Python 代码来进行处理;虽然 Python
代码比精心设计的正则表达式慢,但它也可能更容易理解。
3.特殊字符
在 Python 中有一些特殊的字符,在正则表达式模式中的作用和 shell 和 grep -P
时候有一些细微的差别
正则特殊字符 匹配内容 \w
匹配单个字母、数字、汉字(shell中没有)或下划线 类似于 [a-zA-Z0-9_]
\d
匹配单个数字 类似于 [0-9]
\s
匹配单个任意的空白符,这等价于 [ \t\n\r\f\v]
\S
匹配任何非空白字符, [^ \t\n\r\f\v]
二.re模块
1.常用方法
match()就看开头有没有,只看整个字符串开始的位置。
举例:
s = "isinstance yangge enumerate www.qfedu.com 1997"
import re
In [4]: r = re.match("is\w+", s)
In [8]: r.group() # 获取匹配成功的结果
Out[8]: 'isinstance'
search()只查第一个匹配的
从整个字符串的开头找到最后,当地一个成功匹配后,就停止匹配。
In [9]: r = re.search("a\w+", s)
In [10]: r.group()
Out[10]: 'ance'
findall() 查到所有
搜索整个字符串,找到所有匹配成功的字符串,比把这些字符串放在一个列表中返回。
In [16]: r = re.findall("a\w+", s)
In [17]: r
Out[17]: ['ance', 'angge', 'ate']
sub() 替换
把匹配成功的字符串,进行替换。
#语法:
"""
("a\w+", "100", s, 2)
匹配规则,替换成的新内容, 被搜索的对象, 有相同的话替换的次数
"""
In [24]: r = re.sub("a\w+", "100", s, 2)
In [25]: r
Out[25]: 'isinst100 y100 enumerate www.qfedu.com 1997'
#模式不匹配时,返回原来的值
split() 分割
和 awk -F '[d]'
一样效果,以匹配到的字符进行分割,返回分割后的列表
In [26]: s
Out[26]: 'isinstance yangge enumerate www.qfedu.com 1997'
In [27]: r = re.split("a", s, 1) #1 分割第一个a
使用多个界定符分割字符串
line = 'asdf fjdk; afed, fjek,asdf, foo'
import re
re.split(r'[;,\s]\s*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
\b :匹配边界
2.正则分组
就是从已经成功匹配的内容中,再去把想要的取出来
#match
In [64]: s
Out[64]: 'isinstance yangge enumerate www.qfedu.com 1997'
In [65]: r = re.match("is(\w+)", s)
In [66]: r.group()
Out[66]: 'isinstance'
In [67]: r.groups()
Out[67]: ('instance',)
#search
#命名分组
In [87]: r = re.search("is\w+\s(?P<name>y\w+e)", s) #y开头e结尾中间任意多个字符
In [88]: r.group() #拿正则搜到的所有值
Out[88]: 'isinstance yangge'
In [89]: r.groups() #只拿括号里的
Out[89]: ('yangge',)
In [90]: r.groupdict() #将括号里的以字典形式拿出
Out[90]: {'name': 'yangge'}
#findall
In [98]: s
Out[98]: 'isinstance yangge enumerate www.qfedu.com 1997'
In [99]: r = re.findall("a(\w+)", s)
In [100]: r
Out[100]: ['nce', 'ngge', 'ny', 'te']