0
点赞
收藏
分享

微信扫一扫

【使用Python处理文本2】

正则表达式

基本语法

  • ?[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) #非贪婪匹配
举报

相关推荐

0 条评论