正则表达式
什么是正则表达式
正则表达式,又称规则表达式(Regular Expression,在代码中常简写为regex、regexp或RE),正则表达式描述了一种**字符串匹配的模式**(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
> **总之,正则表达式通常用来检索、替换符合规则的文本。**
组成
原子:普通字符,如英文字符
元字符:有特殊功能的字符
> 一个正则表达式至少有一个原子组成
# 常见的正则字符和含义
匹配单个字符
| 正则字符 | 含义 |
| -------- | ------------------------------------------- |
| . | 匹配任意一个字符,除了换行符 |
| [] | 匹配 [ ] 中列举的字符。例如:[abc]、[a-z] |
| \s | 匹配空白字符,即:空格、换行、Tab符 |
| \S | 匹配任何非空白字符 |
| \d | 匹配数字,等价于`[0-9]` |
| \D | 匹配非数字,等价于`[^0-9]` |
| \w | 匹配字母数字下划线,等价于`[A-Za-z0-9_]` |
| \W | 匹配非字母数字下划线,等价于`[^A-Za-z0-9_]` |
匹配多个字符
| 正则字符 | 含义 |
| -------- | -------------------------------------------------- |
| * | 匹配前一个字符出现0次或多次,即:可有可无 |
| + | 匹配前一个字符出现1次或多次,即:至少有一次 |
| ? | 匹配前一个字符出现0次或1次,即:要么一次,要么没有 |
| {m} | 匹配前一个字符出现m次 |
| {m,n} | 匹配前一个字符出现从m到n次 |
匹配开头结尾
| 正则字符 | 含义 |
| -------- | -------------- |
| ^在[]外 | 匹配字符串开头 |
| ^在[]内 | 取反 |
| $ | 匹配字符串末尾 |
匹配分组
| 正则字符 | 含义 |
| -------- | ----------------------------------------------------- |
| \| | 匹配左右任意一个表达式 |
| () | 将括号中字符作为一个分组 |
| \num | 引用分组num匹配到的字符串 |
| 起别名 | 定义:(`?P<name1>`正则表达式)<br />引用:`(?P=name1)` |
re模块
`re`是Python标准库中的一个模块,用于进行正则表达式匹配和操作。正则表达式是一种强大的模式匹配工具,可以用于在字符串中进行搜索、替换和分割操作。
要使用`re`模块,首先需要导入:
import re
在Python中,可以使用`re`模块来创建正则表达式对象并进行匹配、查找、替换等操作。`re`模块提供了许多函数和方法,包括:
- `re.search(pattern, string, flags=0)`:在字符串中搜索并返回第一个匹配的结果对象。可以指定可选的`flags`参数来修改匹配的行为。
- `re.match(pattern, string, flags=0)`:从字符串的开头开始匹配,如果匹配成功则返回结果对象,否则返回`None`。
- `re.findall(pattern, string, flags=0)`:返回所有与正则表达式匹配的非重叠结果的列表。
- `re.sub(pattern, repl, string, count=0, flags=0)`:使用`repl`替换字符串中与正则表达式匹配的部分。可选的`count`参数用于指定最多替换次数。
match和search的返回结果方法:
| 方法 | 含义 |
| ------- | ------------------------------------- |
| group() | 返回被re匹配的字符串 |
| start() | 返回匹配的开始位置 |
| end() | 返回匹配的结束位置 |
| span() | 返回一个元组包含匹配(开始,结束)的位置 |
贪婪与非贪婪
在Python中,正则表达式(re)模块支持贪婪(greedy)和非贪婪(non-greedy)匹配模式。贪婪匹配尽可能匹配更多的字符,而非贪婪匹配尽可能匹配更少的字符。
> 在匹配字符后面添加?,匹配非贪婪模式。
# 贪婪和非贪婪 st = """ <img src="https://img.xx.a" title="美女图片"/> <img src="http://img.xx.a" title="美女图片"/> <img src="/img.xx.a" title="美女图片"/> """ # 通过re模块中的findall提取上述字符串的src属性值 all = re.findall('src="(.+?)"',st) print(all) all = re.findall('src="(.+)"',st) print(all)
正则字符串前面加上"r"表示:让正则中的“\”不再具有转义功能