正则表达式
正则表达式是一个强大的文本处理工具,在Linux系统中使用广泛,Linux系统中大部分文本处理工具都支持正则表达式,如grep、sed和awk
基本语法
- ?[a-zA-Z]+ : 匹配给定文本中的所有单词
?用于匹配单词前后可能出现的空格;[a-zA-Z]+代表一个或多个英文字母 - [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} : 匹配一个IP地址
[0-9]表示数字;{1,3}表示1到3位数的数字组合;.在正则表达式中有特殊含义,所以需要用反斜杠进行转义
利用re库处理正则表达式
在Python中,标准库的re模块用来处理正则表达式,它能够顺利处理Unicode和普通字符串。这个模块包含了与正则表达式相关的函数、标志和一个异常。
最常用的是re模块下的findall函数,用来输出所有符合模式匹配的子串
import re
data="What is the difference between python 2.7.13 and python 3.6.0?"
re.findall('python [0-9]\.[0-9]\.[0-9]',data)
如果定义了错误的正则表达式,re模块会抛出一个异常
python中有两种使用正则表达式的方法
- 直接使用re模块中的函数
前面的例子就是直接使用re模块的函数 - 创建一个特定模式编译的正则表达式对象
如下代码所示:
import re
data="What is the difference between python 2.7.13 and python 3.6.0?"
re_obj=re.compile('python [0-9]\.[0-9]\.[0-9]',flags=re.IGNORECASE)
re_obj.findall(data)
编译版本的代码相对而言具有更好的程序执行性能
常用的re方法
匹配类方法
- findall() : 查找子串,成功返回匹配子串的列表(没有找到返回空列表)
- match() : 类似字符串的startswith()方法,但是可以用正则表达式做模糊匹配,更加强大。匹配成功返回一个SRE_Match对象
- search() : 与match()方法极为类似,只是search()可以在字符串的任意位置进行匹配
- finditer() : 返回一个迭代器
修改类方法
- sub() : 类似字符串的replace()方法,但是支持正则表达式
- split() : 将字符串拆分成子串,支持正则表达式
大小写不敏感
re.findall('python [0-9]\.[0-9]\.[0-9]',data,flags=re.IGNORECASE)
非贪婪匹配
比如要匹配以'Beautiful'开头并且以点号结尾的字符串,默认情况下正则表达式使用贪婪匹配,就是如果有多个字符串都符合这一规则,尽可能匹配长的字符串,如果要使用非贪婪匹配,需要在匹配字符串时加上一个"?"
text="Beautiful is better than ugly. Explicit is better than implicit."
re.findall('Beautiful.*\.',text) #贪婪匹配
re.findall('Beautiful.*?\.',text) #非贪婪匹配
网友评论