第二章 正则表达式
00 min
2024-4-23
正则表达式学习网站:
正则表达式 英文名称叫 Regular Expression简称RegEx,是用来匹配字符的一种工具,它常被用在网页爬虫,文稿整理,数据筛选, 数据隐藏等方面,最常用的就是用在网页爬虫,数据抓取。
另外, 正则表达式并不是Python所独有的, 在Java, PHP, Go以及JavaScript等语言中都支持正则表达式的.
 

正则字符分类

字符串限定类

符号
含义
例子
解释
^
匹配字符串的开头
“^a”
匹配以a开头的字符串
$
匹配字符串的末尾。
“a$”
匹配以a结尾的字符串
.
匹配任意一个字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
“.{3}”
匹配任意三个字符
[...]
用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
“[0-9a-zA-Z]{3}” ”[amk]{3}”
匹配三个字符, 字符只能是数字,大/小写字母 匹配三个字符, 字符只能是 'a','m'或'k'
[^...]
不在[]中的字符
“[^abc]“
匹配一个除了a,b,c之外的字符。
a|b
匹配字符a或b
“a|b|c”
匹配一个字符, 为a或b或c
\w
匹配字母数字及下划线
\W
匹配非字母数字及下划线
\s
匹配任意空白字符
等价于 [ \t\n\r\f]
\S
匹配任意非空字符
\d
匹配任意数字
等价于 [0-9]
\D
匹配任意非数字
\A
匹配字符串开始
\Z
匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z
匹配字符串结束
\G
匹配最后匹配完成的位置。
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B
匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等.
匹配一个换行符。匹配一个制表符。等
\1...\9
匹配第n个分组的内容。
\10
匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式

限定表达式类

符号
含义
例子
解释
*
表示0个或多个正则表达式。
.*
匹配任意数量的任意个字符
+
匹配1个或多个表达式。
“.+”
匹配一个或多个数量的任意字符
?
匹配0个或1个表达式
“a?”
匹配一个或一个a字符
{n}
精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。
{n,}
匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。
{n, m}
匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
(re)
对正则表达式分组并记住匹配的文本
(?imx)
正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx)
正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re)
类似 (...), 但是不表示一个组
(?imx: re)
在括号中使用i, m, 或 x 可选标志
(?-imx: re)
在括号中不使用i, m, 或 x 可选标志
(?#...)
注释.
(?= re)
前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re)
前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re)
匹配的独立模式,省去回溯。

Python正则表达式-re模块

Python使用re模块提供了正则表达式处理的能力

常量

使用|位或运算开启多种选项
 

功能

re模块提供的正则表达式主要有六个功能
  • 单次匹配
  • 全文匹配
  • 匹配替换
  • 分组
  • 分割字符串
  • 编译
 

单次匹配

  • re.match(pattern, string, flags=0)
    • 从字符串开头匹配, 匹配成功返回match对象, 否则返回None
    • pattern: 正则表达式
    • string: 要匹配的字符串
    • flags: 匹配模式(后面介绍)
  • re.search(pattern, string, flags=0)
    • 从字符串任意位置匹配, 返回match对象, 否则返回None
    • 参数介绍同上
  • fullmatch(pattern, string, flags=0)
    • 整个字符串和正则表达式进行匹配, 返回match对象, 否则返回None
  • group([0])
    • 返回match匹配对象的整个匹配结果或特定的分组匹配结果
    • 默认参数为0, 返回整个匹配对象的匹配结果
    • 参数为其他整数, 返回特定分组的匹配结果(分组后面介绍)
  • groups()
    • 返回的match匹配对象的所有分组匹配结果组成的元组
注: 如果匹配不成功, 则返回的是None对象, 不会有group方法
贪心匹配和非贪心匹配
  • 贪心匹配:匹配可选范围内最长字符串(一般默认都是贪心匹配)
  • 非贪心匹配:匹配可选范围内最短字符串
:`?` 在正则表达式中可能有两种含义: 声明非贪心匹配表示可选的分组。这两种含义是完全无关的

全文匹配

  • findall(pattern, string, flags=0)
    • 从字符串任意位置查找, 返回一个列表
  • finditer(pattern, string, flags=0)
    • 从字符串任意位置查找, 返回一个迭代器, 迭代出来的是match对象, 需要再通过group方法查看

匹配替换

  • re.sub(pattern, replacement, string, count=0, flags=0)
    • replacement: 用replacement替换掉string中被pattern表达式匹配的字符
    • replacement可以是string, bytes, function.
    • count: 最大替换次数
  • re.subn(pattern, replacement, string, count=0, flags=0)
    • 同sub方法, 返回一个元组(new_string, number_of_subs_made)

分组

使用小括号的pattern捕获的数据别放在了组group中
match, search方法可以返回match对象; findall但会字符串列表; finditer返回迭代器, 可迭代出match对象
如果pattern(正则表达式)中使用了分组并且有匹配的结果, 会在match对象中.
  • 使用group(N)方式返回对应分组, 1到N是对应的分组, 0返回整个匹配的字符串
  • 如果使用了命名分组, 可以使用group(”name”)方式取分组
  • 也可以使用groups返回所有分组
  • 使用groupdict()返回所有命名的分组
起别名:
  • ?P<name>
    • 在需要起别名的分组括号内添加字符, name为分组名
  • (?P=name)
    • 在需要引用分组名为name的地方添加, 引用对应的分组的正则表达式

分割字符串

字符串的分割字符串方法str.split, 太难用了, 不能指定多个字符串进行分割.
  • re.split(pattern, string, maxsplit=0, flags=0)
    • maxsplit为最大分割次数
 

编译

1、常量
常量
说明
re.M re.MULTILINE
多行模式
re.S re.DOTALL
单行模式
re.I re.IGNORECASE
忽略大小写
re.X re.VERBOSE
忽略表达式中的空白字符
2、编译 —>复用正则表达式
  • re.compile(pattern, flags=0)
    • 返回正则表达式对象regex
    • pattern为正则表达式
    • flags: 可选, 编译模式
    • re的其他方法为了提高效率都调用了编译方法
正则表达式可以被编译, 为了提高效率, 这些编译后的结果被保存, 下次使用同样的pattern的时候, 就不需要再次编译.
3、常量的匹配模式
待续。。。