简介
笔者的正则的学习笔记和思维导图
用处
- 字符串匹配
- 字符串查找
- IDE集成
如何学习
- 分类别记忆
- 多练习,无他,唯手熟尔。
- 潜龙勿用
1. 正则元字符
何为元字符,就是有特殊意义的字符比如\d, \w,可以分为
-
特殊单字符
a. \d 任意数字, \D 任意非数字
b. \w 任意字母数字下划线, \W 任意非字母数字下划线
c. \s 任意空白符, **\S ** 任意非空白符
d. . 任意字符(换行符除外) -
空白字符
a. \r 回车
b. \n 换行
c. \f 换页符
d. \t 制表符
e. \v 垂直制表符 -
量词
a. * 0到多次
b. + 1到多次
c. ? 0到1次
d. {m} 出现m次
e. {m,} 出现至少m次
f. {m, n} M到N次 -
范围处理
a. | 如ab|ac 代表ab或者ac.
b. [……]多选一,任意单个元素,注意[1,2]代表1 , 2三个元素但是[^1]代表非1
c. [a-z] 匹配a到Z之间的任意单个字符。常用的[a-zA-Z0-9]
2. 正则匹配模式
- 贪婪匹配
import re
re.findall(r'a*', 'aaabbb')
['aaa', '', '', '', '']
默认是贪婪模式,尽可能多的去匹配字符串
- 非贪婪匹配
import re
re.findall(r'a*?', 'aaabbb')
['', 'a', '', 'a', '', 'a', '', '', '', '']
加 ? 代表非贪婪匹配,尽可能少的匹配字符串
- 独占模式
无论是贪婪模式还是非贪婪模式,都需要回溯才能完成相应功能。还有一种不需要回溯,叫独占模式,准确的形容为,不会交还已经匹配上的字符。
独占模式具体的方法就是在量词后加上加号(+)。
什么是回溯呢
Exp:
pip install regex
ipython
import regex
regex.findall(r'a{1,3}abb', 'aaabb')
['aaabb']
regex.findall(r'a{1,3}+abb', 'aaabb')
Out[8]: []
regex.findall(r'a{1,3}?abb', 'aaabb')
Out[9]: ['aaabb']
贪婪模式下,会尽可能的多的匹配总费用,匹配第四个b时,碰到了c字符,需要回溯到前一个上在做c字符匹配。如果发生回溯,则可以匹配,如果不回溯,在独占模式下,则不匹配。
3. 分组与编号
正则表达式中()代表一个组。
Exp: 匹配重复字符串
text='man man , what`s the fuck fuck!'
rexp=r'(\w+)(\s+\1)+'
re.findall(rexp, text)
[('man', ' man'), ('fuck', ' fuck')]
正则表达式中 \1 就是前边 (\w+) 的值。
那么多个括号嵌套怎么算?
从第一个( 算起,编号从1到n,如果不想被引用,怎么办?
加入 ?:
rexp=r'(\w+)(?:\s+\1)(\2)'
这里(\2)不会生效。
这个功能设计看起来花里胡哨,如何落地使用呢??最简单的就是字符串替换
>>> import re
>>> test_str = "2020-05-10 20:23:05"
>>> regex = r"((\d{4})-(\d{2})-(\d{2})) ((\d{2}):(\d{2}):(\d{2}))"
>>> subst = r"日期\1 时间\5 \2年\3月\4日 \6时\7分\8秒"
>>> re.sub(regex, subst, test_str)
'日期2020-05-10 时间20:23:05 2020年05月10日 20时23分05秒'
4. 匹配模式
- 不区分大小写
>>> import re
>>> re.findall(r"cat", "CAT Cat cat", re.IGNORECASE)
['CAT', 'Cat', 'cat']
a. 不区分大小写模式的指定方式,使用模式修饰符 (?i)
b. 修饰符如果在括号内,作用范围是这个括号内的正则,而不是整个正则;
c. 使用编程语言时可以使用预定义好的常量来指定匹配模式。
-
. 通配模式
匹配任意字符可以用 [\s\S], [\d\D], [\w\W] 但是比较麻烦
可以设置点号通配符
(?s).
-
多行模式
(?m)
正则中还有 \A 和 \z(Python 中是 \Z) 这两个元字符容易混淆,\A 仅匹配整个字符串的开始,\z 仅匹配整个字符串的结束,在多行匹配模式下,它们的匹配行为不会改变,如果只想匹配整个字符串,而不是匹配每一行,用这个更严谨一些 -
注释模式
(?#comment)
5. 断言
- 单词边界
- 行的开始/结束
- 环视
6.转义字符
这里什么好说的,需要注意编程语言自身会做转义字符处理,正则还要做转义字符处理,有时候会是4个\
7. 历史
- POSIX
- PCRE
8 拓展
笔者认为:正则表达式是一种图灵不完备的编程范式,每种语言go、python、 java、js都有各自的实现与支持的规范。
但是正则表达式包含了常见语言的三要素:
- 顺序
- 分支 a|b
- 循环 *, +, {m, n}
甚至还有作用域()
结束语
持续学习和输出会让你更快乐
网友评论