正则表达式
概念¶
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的
模式¶
| 模式 | 描述 |
|---|---|
^ |
匹配字符串的开头 |
$ |
匹配字符串的末尾 |
. |
匹配任意字符 |
\ |
是之后的表示式失效, 仅匹配其字面字符 |
[...] |
用来表示一组字符, 单独列出 [amk] 匹配 ‘a’, ‘m’ 或 ‘k’ |
[^...] |
匹配不在[]中的字符 |
[...-...] |
匹配一个范围(如果想匹配一个-, 则可以将其放在括号开头或结尾) |
* |
匹配 0 个或多个表达式 |
+ |
匹配 1 个或多个表达式 |
? |
匹配 0 个或 1 个表达式, 非贪婪方式 |
{n} |
精确匹配 n 个表达式 |
{n, m} |
匹配 n 到 m 次表达式, 贪婪方式( 若无 m, 如{n,}, 则匹配 n 到无穷多个表达式) |
a | b |
匹配 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`
re.split(r'\s+', 'a b c')
['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 许可协议。转载请注明来源 Ardenet's Blog!
评论


