当前位置:博客首页 > Python > 正文

第14课 Python3正则表达式

作者: Jarvan 分类: Python 发布时间: 2019-05-24 19:19 百度已收录

一、正则表达式

正则表达式(RE)为高级文本模式匹配,以及搜索-替代等功能提供了基础。 正则表达式是一些由字符和特殊符号组成的字符串,他们描述了这些字符和字符的某种重复方式,因此能按某种模式匹配一个有相似特征的字符串集合,因此能按某种模式匹配一系列有相似特征的字符串。

二、正则表达式使用到的元字符(常用)

正则表达式使用到的元字符

三、正则表达式使用案例

在sublime中演示,具体看视频演示 需要安装Sublime Text 3编辑器(很好用的一款编辑器,推荐使用)

Sublime ctrl+h 查找替换,选择RE模式,$1表示选择第1个分组

以上结果是把 故事 替换为 事故

另外一个案例:([^是])不\1,可以用来匹配除了是不是之外的X不X

四、python中使用正则表达式常用函数和方法

在python中使用正则表达式需要导入正则表达式模块(re)这个是python内置的模块,因此不需要安装,但是需要注意的是我们给文件命名的时候不要使用这个名字,否则就会造成模块名称冲突导致用不了。

# 下面是re模块中split方法的运用,可同时处理多种分隔符,最终输出结果为
# 韩国2018年人均用电量/创新高/专家:电费太便宜了
# 利用split和join以及切片成功去掉了后面的频道名及网站名
title = "韩国2018年人均用电量_创新高,专家:电费太便宜了_新闻频道_网易"
ret = re.split('[_:, ]',title)
ret = ('/'.join(ret[:-2]))
print(ret)

# 查找正文内容,strip()去除头尾空格
txt = re.search(r'<div class="post_text".*?>(.*?)<div class="ep-source cDGray">', content, flags=(re.I | re.S))
txt = txt.group(1).strip()

# 下面是将提取的正文,用.sub()方法替换成空白
#可以去除掉空白字符、去除掉script、style标签及内部的内容、去除各种<标签>,如果用.subn()计算的是替换了多少次
clean = re.sub('<script.*?>.*?</script>|<style.*?>.*?</style>|</?.*?>|\s','',txt,flags=(re.I | re.S))
print(clean)

# 运用sub方法时,可以利用分组\g<1>,保留想要替换部分中的内容
s1 = 'abc 123abc asdf'
s1 = re.sub('a(.*?)c','z\g<1>y', s1)
print(s1)
# 输出结果为:zby 123zby asdf,保留了b

re中的flag参数及其含义

  1. 忽略大小写(常用)
    I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE
  2. \w, \W, \b, \B等是否生效取决于当前的系统环境(其实没啥用)
    L = LOCALE = sre_compile.SRE_FLAG_LOCALE
  3. 匹配Unicode字符串,主要是对与非ASCII码字符串来讲的,因为python2默认的字符串都是ASCII编码的,所
    以模式\w+能匹配的都是ASCII字符,要想让\w+匹配Unicode字符,就可以设置这个flag
    U = UNICODE = sre_compile.SRE_FLAG_UNICODE
  4. 多行匹配,主要就是当匹配行首(^)或行尾($)的时候,如果不使用多行匹配的话,对于多行的文本是不能匹配
    成功的
    M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE
  5. 让点号(.)也代表换行(常用)
    S = DOTALL = sre_compile.SRE_FLAG_DOTALL
  6. 忽略表达式模式中的空白字符和注释
    X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE

五、python正则表达式的使用案例

具体看视频,以实际提取网页数据为案例讲解

  1. compile方法的使用
    compile方法是预先编译正则表达式的匹配模式,然后生成一个缓存,这样在之后的匹配中就可以直接使用这个缓存,而不需要每次匹配都重新编译,从而加快速度。一般情况下只有当一个正则表达式被重复使用多次的时候才需要事先使用compile方法编译,如果只是使用一次就不需要了。
  2. match方法的使用
  3. search方法的使用
  4. findall方法的使用
  5. finditer方法的使用
  6. sub方法的使用
  7. subn方法的使用
# 以下是.search方法的使用,只能查找匹配第1个,输出结果为12
import re
ret = re.search('(\d*)','12hello wor23ld ehello')
print(ret.group(1))

# 以下是.findall方法的使用,可以查找多个,flags=re.M可以多行匹配,输出结果为
# 一个列表,['我是一个多行的语句', '我是不是很厉害']
mul_line = """我是一个多行的语句
可以有数字123
也可以有字母afg
我是不是很厉害
"""
import re
ret= re.findall('(^我\w+)',mul_line,flags=re.M)
print(ret)

六、匹配中文

[\u4E00-\u9FA5\s]+ 多个汉字,包括空格
[\u4E00-\u9FA5]+ 多个汉字,不包括空格
[\u4E00-\u9FA5] 一个汉字

作业

  1. 熟练使用正则表达式提取各种信息
  2. 记住常用的正则表达式元字符,知道贪婪和非贪婪模式的区别
  3. 熟练使用python的正则表达式模块re来提取网页的信息以及其它字符串信息
  4. 熟练使用正则表达式模块re的各种常用方法,以及他们之间的区别和用途。
  5. 学习urllib库的使用

发表评论