正则表达式
正则表达式¶
概念¶
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的
模式¶
模式 | 描述 |
---|---|
^ |
匹配字符串的开头 |
$ |
匹配字符串的末尾 |
. |
匹配任意字符 |
\ |
是之后的表示式失效, 仅匹配其字面字符 |
[...] |
用来表示一组字符, 单独列出 [amk] 匹配 ‘a’, ‘m’ 或 ‘k’ |
[^...] |
匹配不在[] 中的字符 |
[...-...] |
匹配一个范围(如果想匹配一个- , 则可以将其放在括号开头或结尾) |
* |
匹配 0 个或多个表达式 |
+ |
匹配 1 个或多个表达式 |
? |
匹配 0 个或 1 个表达式, 非贪婪方式 |
{n} |
精确匹配 n 个表达式 |
{n, m} |
匹配 n 到 m 次表达式, 贪婪方式( 若无 m, 如{n,} , 则匹配 n 到无穷多个表达式) |
`a | b` |
(...) |
对正则表达式分组并记住匹配的文本 |
(?imx...) |
正则表达式包含三种可选标志: i, m 或 x; 只影响括号中的区域 |
(?-imx...) |
正则表达式关闭 i, m 或 x 可选标志; 只影响括号中的区域 |
(?: ...) |
类似(...) , 但是不表示一个组(即不会保存该组内的数据) |
(?imx:...) /(?-imx:...) |
与上类似 |
(?# ...) |
注释 |
(?=...) |
向前肯定界定符 例: exp1(?=exp2) 查找后面是 exp2 的 exp1 |
(?!...) |
前向否定界定符, 与肯定界定符相反, 当所含表达式不能在字符串当前位置匹配时成功 例: exp1(?!exp2) 查找后面不是 exp2 的 exp1 |
(?>...) |
匹配的独立模式, 省去回溯 |
\s / \S |
\s 匹配所有空白符, 包括换行(等价于[\f\n\r\t\v] )\S 匹配非空白符, 不包括换行(等价于[^\f\n\r\t\v] ) |
\w / \W |
\w 匹配字母, 数字, 下划线, 等价于[A-Za-z0-9_] \W 匹配非数字字母下划线 |
\d / \D |
\d 匹配任意数字\D 匹配任意非数字 |
\A |
匹配字符串开始 |
\z / \Z |
\z 匹配字符串结束\Z 匹配字符串结束, 如果存在换行, 只匹配到换行前的结束字符串 |
\b / \B |
\b 匹配单词边界\B 匹配非单词边界(如er\B 匹配verb , 不能匹配never ) |
\G |
匹配最后匹配完成的位置 |
修饰符¶
修饰符 | 含义 | 描述 |
---|---|---|
i | ignore - 不区分大小写 | 将匹配设置为不区分大小写 |
g | global - 全局匹配 | 查找所有的匹配项 |
m | mluti line - 多行匹配 | 使边界字符^ 和$ 匹配每一行的开头和结尾 |
s | 特殊字符圆点. 包含换行符\n |
默认情况下的. 是匹配除换行符以外的任何字符, 加上修饰符后包含换行符 |
运算符优先级¶
运算符 | 描述 |
---|---|
\ |
转义符 |
() , (?:) , (?=) , [] |
圆括号和方括号 |
* , + , ? , {n} , {n,} , {n,m} |
限定符 |
^ , $ , \任何元字符 、任何字符 |
定位点和序列(即: 位置和顺序) |
| |
替换,“或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food”。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。 |
re 模块¶
在Python
中提供了re
模块来使用正则表达式
由于在Python中的字符串本身也使用\
来转义, 所以在写正则表达式的匹配pattern
时, 一般加上r
前缀
-
match(pattern, str[, flags])
: 判断是否匹配, 如果匹配成功, 返回一个Match
对象, 否则返回None
(只匹配一次, 且从字符串开头匹配) -
search(pattern, str[, flags])
: 扫描整个字符串并返回第一个成功匹配, 返回一个Match
对象(若不指定^
, 则可从任意位置比较) -
findall(pattern, str)
: 找到所有匹配的字符串, 返回一个列表 -
finditer()
: 与 findall() 类似, 返回一个迭代器 -
split(pattern, str)
: 使用正则表达式切分字符串1
2
3
4
5
6# 使用内置的`split`
'a b c'.split(' ')
['a', 'b', '', '', 'c']
# 使用`re`模块的`split`
r'\s+', 'a b c') re.split(
['a', 'b', 'c'] -
re.compile(pattern[, flags])
: 预编译正则表达式, 生成一个Regular Expression
对象, 之后匹配时只需要传入该对象进行比对 -
re.sub(pattern, repl, str[, count=0, flags])
: 将在str
中匹配到的字符串替换为repl
,count
为替换的最大次数, 默认0
为全部替换
注:repl
也可以是一个函数 -
match.group(num)
: 如果在正则表达式中使用了()
进行了分组, 则可以通过match.group(num)
来访问num
组的匹配值(group(0)
为原字符串) -
match.groups()
: 返回匹配到的字符串的元组
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Float's Blog!
评论