Python进阶-正则表达式
正则表达式
用于描述查找某些复杂字符串的规则的工具
下面举两个简单的例子:
-
比如要精确地查找包含
hi
这个单词的字符串,我们可以使用的正则表达式为:\bhi\b
,\b
可以被称作元字符,用于表示单词的开头或结尾
更进一步,我们要查找hi
和后面不远处的Larkin
,我们修改表达式为\bhi\b.*\bLarkin\b
,在这里新增加了两种元字符,分别是:*
和.
*
代表的意思是前面的内容可以重复使用任意次以使整个表达式得到匹配
.
表示匹配任意不包含换行的字符,.*
连在一起使用的意思是任意数量的不包含换行的字符 -
要查找格式类似
020-12345678
, 因为\d
代表任意的数字,所以可以使用\d\d\d-\d\d\d\d\d\d\d\d
来匹配字符串
总结来说,正则表达式是描述字符串结构的一个模板,通过各种元字符,我们可以描述一类字符串的共同特征,通过它来筛选匹配字符串。
常用的元字符:
元字符 | 说明 |
---|---|
. | 匹配任意字符 |
\w | 匹配字母,数字,下划线 |
\s | 匹配空白字符,如换行,制表,tab |
\d | 匹配数字 |
\b | 表示单词的开头或结尾 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
+ | 匹配1次或多次 |
{N} | 匹配N次 |
\W | 匹配不是字母,数字,下划线 |
\S | 匹配非空白字符 |
\D | 匹配非数字 |
\B | 匹配非单词的边界 |
[字符集] | 匹配来自字符集的任意单一字符 |
[^字符集] | 匹配不在字符集中的任意单一字符 |
* | 匹配0次或多次 |
? | 匹配0或1次 |
{M,} | 匹配至少M次 |
{,N} | 匹配至多N次 |
较复杂的元字符:
元字符 | 说明 |
---|---|
(?=larkin) | 匹配到larkin前面的位置 |
(?<=larkin) | 匹配到larkin后面的位置 |
(?!larkin) | 匹配后面不是larkin的位置,不消耗任何字符([^]则会使用一个字符) |
(?<!larkin) | 匹配前面不是larkin的位置 ,(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内里的内容 |
*? | 可使用任意次,但次数尽可能少 |
+? | 可使用至少一次,但次数尽可能少 |
?? | 可使用0或1次,但次数尽可能少 |
{M,N}? | 可使用M到N次,但次数尽可能少 |
(?#) | 注释 |
上面的表格是很难记住的,但是不断反复使用可以常用常新。推荐一篇博客的链接,虽然是.NET
框架下的正则表达式,但是格式相同且讲解清楚:https://deerchao.cn/tutorials/regex/regex.htm
re
模块常用函数
函数 | 说明 |
---|---|
compile(pattern, flags=0) | 编译正则表达式返回正则表达式对象 |
match(pattern, string, flags=0) | 用正则表达式匹配字符串 成功返回匹配对象 否则返回None,部分匹配 |
search(pattern, string, flags=0) | 搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None |
split(pattern, string, maxsplit=0, flags=0) | 用正则表达式指定的模式分隔符拆分字符串 返回列表 |
sub(pattern, repl, string, count=0, flags=0) | flags=0) 用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数 |
fullmatch(pattern, string, flags=0) | match函数的完全匹配(从字符串开头到结尾)版本 |
findall(pattern, string, flags=0) | 查找字符串所有与正则表达式匹配的模式 返回字符串的列表 |
finditer(pattern, string, flags=0) | 查找字符串所有与正则表达式匹配的模式 返回一个迭代器 |
purge() | 清除隐式编译的正则表达式的缓存 |
re.I / re.IGNORECASE | 匹配时不区分大小写 |
re.M / re.MULTILINE | 更改^和 的 含 义 , 使 它 们 分 别 在 任 意 一 行 的 行 首 和 行 尾 匹 配 , 而 不 仅 仅 在 整 个 字 符 串 的 开 头 和 结 尾 匹 配 。 ( 在 此 模 式 下 , 的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下, 的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,的精确含意是:匹配\n之前的位置以及字符串结束前的位置.) |
实际开发中可以使用正砸表达式对象替代这些函数的使用,若一个正则表达式需要多次使用,先用compile
编译后重复使用对象更为明智。
在书写正则表达式时使用了“原始字符串”的写法(在字符串前面加上了r),所谓“原始字符串”就是字符串中的每个字符都是它原始的意义,说得更直接一点就是字符串中没有所谓的转义字符啦。因为正则表达式中有很多元字符和需要进行转义的地方,如果不使用原始字符串就需要将反斜杠写作\,例如表示数字的\d得书写成\d,这样不仅写起来不方便,阅读的时候也会很吃力。