正则表达式学习网站:
正则表达式 英文名称叫 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、常量的匹配模式
待续。。。