Python之正则表达式详解

0.概述

资料来源:
https://docs.python.org/zh-cn/3/library/re.html

模式和被搜索的字符串可以是Unicode字符串(str)或者8位字节串(bytes).但是两者不能够混用,

提供正则表达式操作。

其中有常用的几种方法:
不进行转义处理: r”\n” 表示 \和n两个字符的字符串,而”\n”表示换行符。

有一些字符是特殊的元字符(matacharacters),并且不匹配自己。相反,它们表示匹配一些不同的东西,或者通过重复它们或者改变它们的含义来影响正则的其他部分。

1.元字符的完整列表:

1
. ^ $ * + ? {  } [  ] \ | (  )

1.1 匹配字符

[ ]:用来指定字符类,希望匹配的一组字符。
例如:
[abc] 将匹配任何字符 a、 b 或 c ;这与 [a-c] 相同,它使用一个范围来表示同一组字符。 如果你只想匹配小写字母,你的正则是 [a-z] 。

字符类中的元字符不生效。
例如:
[akm$] 将匹配 ‘a’ , ‘k’ 、 ‘m’ 或 ‘$’ 中的任意字符; ‘$’ 通常是一个元字符,但在一个字符类中它被剥夺了特殊性。

你可以通过以下方式匹配 complementing 设置的字符类中未列出的字符。这通过包含一个 ‘^’ 作为该类的第一个字符来表示。 例如,[^5] 将匹配除 ‘5’ 之外的任何字符。 如果插入符出现在字符类的其他位置,则它没有特殊含义。 例如:[5^] 将匹配 ‘5’ 或 ‘^’。

也许最重要的元字符是反斜杠,\。 与 Python 字符串文字一样,反斜杠后面可以跟各种字符,以指示各种特殊序列。它也用于转义所有元字符,因此您仍然可以在模式中匹配它们;例如,如果你需要匹配 [ 或 \,你可以在它们前面加一个反斜杠来移除它们的特殊含义:[ 或 \。

一些以 ‘' 开头的特殊序列表示通常有用的预定义字符集,例如数字集、字母集或任何非空格的集合。

\d
\D
\s
\S
\w
\W
.(点) 在默认模式,匹配除了换行的任意字符。如果指定了标签 DOTALL ,它将匹配包括换行符的任意字符。

^
(插入符号) 匹配字符串的开头,

1.2 重复

重复中我们要了解的第一个元字符是 *。 * 与字面字符 ‘*’ 不匹配;相反,它指定前一个字符可以匹配零次或多次,而不是恰好一次。

例如,ca*t 将匹配 ‘ct’ (0个 ‘a’ 字符),’cat’ (1个 ‘a’ ), ‘caaat’ (3个 ‘a’ 字符),等等。

另一个重复的元字符是 +,它匹配一次或多次。 要特别注意 * 和 + 之间的区别;* 匹配 零次 或更多次,因此重复的任何东西都可能根本不存在,而 + 至少需要 一次。

例如,ca+t 将匹配 ‘cat’ (1 个 ‘a’),’caaat’ (3 个 ‘a’),但不会匹配 ‘ct’。

重复限定字符,问号字符 ? 匹配一次或零次;你可以把它想象成是可选的。

例如,home-?brew 匹配 ‘homebrew’ 或 ‘home-brew’。

最复杂的重复限定符是 {m,n},其中 m 和 n 是十进制整数。 这个限定符意味着必须至少重复 m 次,最多重复 n 次。

例如,a/{1,3}b 将匹配 ‘a/b’ ,’a//b’ 和 ‘a///b’ 。 它不匹配没有斜线的 ‘ab’,或者有四个的 ‘a////b’。

你可以省略 m 或 n; 在这种情况下,将假定缺失值的合理值。 省略 m 被解释为 0 下限,而省略 n 则为无穷大的上限。

还原论者的读者可能会注意到其他三个限定符都可以用这种表示法表达。 {0,} 与 * 相同, {1,} 相当于 + , {0,1} 和 ? 相同。 最好使用 * , + 或 ? ,只要因为它们更短更容易阅读。

2.使用正则表达式

方法 / 属性

目的

match():确定正则是否从字符串的开头匹配。

1
2
3
4
group():返回正则匹配的字符串
start():返回匹配的开始位置
end():返回匹配的结束位置
span():返回包含匹配 (start, end) 位置的元组

search():扫描字符串,查找此正则匹配的任何位置。

findall():找到正则匹配的所有子字符串,并将它们作为列表返回。

finditer():找到正则匹配的所有子字符串,并将它们返回为一个 iterator。