正则表达式学习笔记

正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern)。正则表达式是由普通字符以及特殊字符构成的文字模式。

构建正则表达式和写数学表达式一样,通过元字符和运算符将小的表达式构建为更大的表达式。

元字符

正则表达式主要依赖元字符, 元字符不代表其本身的含义而是具有特殊的含义。

元字符 描述
. 句号匹配任意单个字符除了换行符。
[ ] 字符种类。匹配方括号内的任意字符。
否定的字符种类。匹配除了方括号里的任意字符
* 匹配>=0个重复的在*号之前的字符。
+ 匹配>=1个重复的+号前的字符。
? 标记?之前的字符为可选(0次或者1次).
{n,m} 匹配num个大括号之前的字符或字符集 (n <= num <= m).
(xyz) 字符集,匹配与 xyz 完全相等的字符串.
\ 或运算符,匹配符号前或后的字符.
\ 转义字符,用于匹配一些保留的字符 `[ ] ( ) { } . * + ? ^ $ \ `
^ 从开始行开始匹配.
$ 从末端开始匹配.

简写字符集

正则表达式提供一些常用的字符集简写。如下:

简写 描述
. 除换行符外的所有字符
\\w 匹配所有字母数字,等同于 [a-zA-Z0-9_]
\\W 匹配所有非字母数字,即符号,等同于: [^\w]
\\d 匹配数字: [0-9]
\\D 匹配非数字: [^\d]
\\s 匹配所有空格字符,等同于: [\t\n\f\r\p{Z}]
\\S 匹配所有非空格字符: [^\s]
\\f 匹配一个换页符
\\n 匹配一个换行符
\\r 匹配一个回车符
\\t 匹配一个制表符
\\v 匹配一个垂直制表符
\\p 匹配 CR/LF(等同于 \r\n),用来匹配 DOS 行终止符

定位符

​ 定位符能将正则表达式固定到行首或行尾。同时能将正则表达式固定在单词内部,单词的开头或结尾。

字符 描述
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
\\b 匹配一个单词边界,即字与空格间的位置。
\\B 非单词边界匹配。

修饰符(标志)

​ 标志也叫模式修正符,因为它可以用来修改表达式的搜索结果。 这些标志可以任意的组合使用,它也是整个正则表达式的一部分。标记不写在正则表达式里,标记位于表达式之外,格式如下:

/pattern/flags

标志 描述
i 忽略大小写。
g 全局搜索。
m 多行修饰符:锚点元字符 ^ $ 工作范围在每行的起始。

运算优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。

相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

运算符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
\ 替换,”或”操作 字符具有高于替换运算符的优先级,使得”m\ food”匹配”m”或”food”。若要匹配”mood”或”food”,请使用括号创建子表达式,从而产生”(m\ f)ood”。

零宽度断言

先行断言和后发断言都属于非捕获簇(不捕获文本 ,也不针对组合计进行计数)。 先行断言用于判断所匹配的格式是否在另一个确定的格式之前,匹配结果不包含该确定格式(仅作为约束)。

?=... 正先行断言

?=... 正先行断言,表示第一部分表达式之后必须跟着 ?=...定义的表达式。

返回结果只包含满足匹配条件的第一部分表达式。 定义一个正先行断言要使用 ()。在括号内部使用一个问号和等号: (?=...)

正先行断言的内容写在括号中的等号后面。 例如,表达式 (T|t)he(?=\sfat) 匹配 Thethe,在括号中我们又定义了正先行断言 (?=\sfat) ,即 Thethe 后面紧跟着 (空格)fat

1
"(T|t)he(?=\sfat)" => The fat cat sat on the mat.

?!... 负先行断言

负先行断言 ?! 用于筛选所有匹配结果,筛选条件为 其后不跟随着断言中定义的格式。 正先行断言 定义和 负先行断言 一样,区别就是 = 替换成 ! 也就是 (?!...)

表达式 (T|t)he(?!\sfat) 匹配 Thethe,且其后不跟着 (空格)fat

1
"(T|t)he(?!\sfat)" => The fat cat sat on the mat.

?<= ... 正后发断言

正后发断言 记作(?<=...) 用于筛选所有匹配结果,筛选条件为 其前跟随着断言中定义的格式。 例如,表达式 (?<=(T|t)he\s)(fat|mat) 匹配 fatmat,且其前跟着 Thethe

1
"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.

?<!... 负后发断言

负后发断言 记作 (?<!...) 用于筛选所有匹配结果,筛选条件为 其前不跟随着断言中定义的格式。 例如,表达式 (?<!(T|t)he\s)(cat) 匹配 cat,且其前不跟着 Thethe

1
"(?<!(T|t)he\s)(cat)" => The cat sat on cat.

贪婪和惰性匹配(Greedy vs lazy )

* 匹配>=0个重复的在*号之前的字符。

+ 匹配>=1个重复的+号前的字符。

? 标记?之前的字符为可选(0次或者1次)。

正则表达式默认采用贪婪匹配模式,在该模式下意味着会匹配尽可能长的子串。我们可以使用 ? 将贪婪匹配模式转化为惰性匹配模式。

To be continued...

示例 1

提取以下文本内容中的emoji表情

1
2
<div class="col"><div class="emoji_card"><a href="/zh-hans/emoji/%F0%9F%90%AE" class="emoji_font">🐮</a><a href="/zh-hans/emoji/%F0%9F%90%AE" class="emoji_name truncate">奶牛头</a><a class="emoji_symbol" data-clipboard-text="🐮">复制</a></div></div>
<div class="col"><div class="emoji_card"><a href="/zh-hans/emoji/%F0%9F%90%82" class="emoji_font">🐂</a><a href="/zh-hans/emoji/%F0%9F%90%82" class="emoji_name truncate">公牛</a><a class="emoji_symbol" data-clipboard-text="🐂">复制</a></div></div>

示例 2

删除resource_path(),保留os.path.join(“audios”, “j.mp3”)

1
resource_path(os.path.join("audios", "j.mp3"))

reference

1.learn-regex

2.正则表达式-教程

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2023 Wh
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信