正则表达式re模块用法

re(Regular Expression)/正则表达式是一个内置的文本处理模块,在进行数据处理(筛选、替换)以及网页数据抓取时十分常用该模块的主要功能是基于给定的表达式匹配字符串中的某些内容,本文参考官方文档,学习以下几点内容:1-正则表达式的语法;2-常用函数及参数;3-案例及常用表达式

先介绍函数,再介绍写法

1
import re

函数方法

flages是在匹配时的附加参数,获得更加准确及干净的匹配结果,如可以选择不考虑换行,忽略大小写等

方法及对象

  1. re.compile(pattern, flags=0):将表达式编译为正则表达式对象以供后续使用/复用
    • 输入pattern为表达式字符串,返回对象类型为 <class 're.Pattern'>,可以直接进行检索也可作为其他函数的pattern输入
1
2
3
pattern_ = re.compile(pattern)
result = re.match(pattern_, string)#实际上就等价于re.match(pattern, string)
# 其他参见pattern_.search();pattern_.match();pattern_.split();pattern_.findall();...
  1. re.findall(pattern, string, flags=0):常用,返回全部匹配结果,以列表list返回
    • 通过在表达式中加括号可以实现元组分组,两个示例
    • re.finditer(pattern, string, flags=0):同上,但是返回结果为一个迭代器
1
2
3
4
re.findall(r'[a-zA-Z]+', 'Which453foot378(*&…… or378 378hand378 fell378 fastest')
# 返回其中的单词 ['which', 'foot', 'or', 'hand', 'fell', 'fastest']
re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10')
[('width', '20'), ('height', '10')]
  1. re.search(pattern, string, flags=0): 整个字符串匹配并返回满足pattern的的第一个位置,可以为空

    • 返回对象类型是<class 're.Match'>,如果没有匹配到,则返回None ;
  2. re.match(pattern, string, flags=0): 匹配字符串开头是否满足pattern并返回,不常用

  3. re.split(pattern, string, maxsplit=0, flags=0):匹配表达式分割string,如匹配逗号分开单词

    • 可以视为str.split(char, num)的加强版,maxsplit设置分割次数,默认全部分割

    • 如果pattern中包含了括号则会同时返回匹配到的内容及切分后的结果,示例:

1
2
3
4
re.split(r'\W+', 'Words, words, words.')
# ['Words', 'words', 'words', '']
re.split(r'(\W+)', 'Words, words, words.')
# ['Words', ', ', 'words', ', ', 'words', '.', '']
  1. re.sub(pattern, repl, string, count=0, flags=0):查找并替换string中pattern匹配的内容

    • repl是替换为的新的内容,也可以是一个函数

    • 可以视为str.replace(‘...’, ‘...’)的加强版,re.``subn()类似,但是会同时返回替换/匹配成功的次数

flags参数

一次只能设一个

表达式flags= 全称 功能
re.A ASCII 让 , , , , 和 只匹配ASCII,而不是Unicode
re.I IGNORECASE 忽略大小写匹配
re.S DOTALL 最常用,让 '.' 特殊字符匹配任何字符,包括换行符
re.M MULTILINE 当之前只能匹配字符串开头结尾的的可以拓展到多行的开头结尾
re.X VERBOSE 编写友好,写表达式时可以进行分段和添加注释

正则表达式语法

最重要的是完成准确的正则表达式的书写,通常的形式是 r'raw...'

正则表达式的几个点

  1. 可以拼接组合,如‘a-zA-Z’会一起匹配大小写字母,A|B 或匹配,优先A
  2. 可以包含普通或者特殊字符,
  3. 元字符有. ^ $ * + ? { } [ ] \ | ( ),它们不匹配自己
  4. 反斜杠\用于和其他字母组合表示特殊匹配形式
  5. 重复修饰符 (*, +, ?, {m,n},字面意思,重复匹配
  6. 关于转义符的解释:r"\n" 表示包含 '\''n' 两个字符的字符串,而 "\n" 则表示只包含一个换行符的字符串,r".*?"匹配特殊序列而不是匹配?本身。

语法-详细参考,此处仅介绍部分

  • .:匹配除了换行的任意字符。如果指定了标签re.S,它将匹配包括换行符的任意字符。
  • []:表示一个字符集合,如[amk]匹配三个字母,[0-5][0-9]匹配00-59
    • 特殊字符在集合中会失去其特殊意义,如[(+*)] 只会匹配这几个字面字符之一 '(', '+', '*', or ')'
    • [^...],匹配不在 [] 中的字符
  • (): 匹配括号内的表达式,也表示一个组

重复匹配符

  • *: 对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。
  • +: 对它前面的正则式匹配1到任意次重复。
  • ?: 对它前面的正则式匹配0到1次重复。 ab? 会匹配 'a' 或者 'ab'
  • *?, +?, ??
  • {m}
  • {mn}对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多。
  • {m,n}?:同上,但是非贪婪模式,及尽可能少

匹配数字字母及下划线等符号

  • \d:匹配数字想当于[0-9];\D匹配非数字相当于[^0-9]
  • \s: 匹配任意空白字符(换行符等),等价于 [,\S取反
  • \w: 匹配字母数字及下划线,大写\W则取反

其他:\A \z等匹配字符串的开头结尾

案例及常用

任意匹配:.*?

匹配url: [a-zA-z]+://[^\s]*

参考

源代码位置:Lib/re.py

官方文档: api