一、官方文档
正则表达式HOWTO — Python 3.10.2 文档https://docs.python.org/zh-cn/3/howto/regex.html#regex-howto
re --- 正则表达式操作 — Python 3.10.2 文档https://docs.python.org/zh-cn/3/library/re.html#re-syntax
正则表达式(称为RE,或正则,或正则表达式模式)本质上是嵌入在Python中的一种微小的、高度专业化的编程语言,可通过 re 模块获得。 使用这种小语言,你可以为要匹配的可能字符串集指定规则;此集可能包含英语句子,电子邮件地址或你喜欢的任何内容。 然后,您可以询问诸如“此字符串是否与模式匹配?”或“此字符串中的模式是否匹配?”等问题。 你还可以使用正则修改字符串或以各种方式将其拆分。
RE在python中的实现模块为re,属于官方内置模块。RE在多种语言都有实现,实现方式大同小异,因此,它值得你拥有!
二、根据官方文档进行操作
1、了解匹配字符
元字符 | 含义 |
. | 任意匹配:匹配除换行符之外的任何内容(注意:一个“.”代表一个字符) |
^ | 行的头部匹配:在行的开头匹配。 除非设置了 |
$ | 行的末尾匹配:匹配行的末尾,定义为字符串的结尾,或者后跟换行符的任何位置。(注意:只匹配每一行的末尾连续字段,中间字段不匹配,形式以$结尾) |
* | 重复匹配:指定前一个字符可以匹配零次或多次,而不是恰好一次,例如,ca*t 将匹配 'ct' (0个 'a' 字符),'cat' (1个 'a' ), 'caaat' (3个 'a' 字符),等等。类似 * 这样的重复是 贪婪的;当重复正则时,匹配引擎将尝试尽可能多地重复它(一直往前寻找*的前一个字符,直至找到或找不到)。特别的,字符串 'abcbd'的正则 表达式为a[bcd]*b,会先找到a,然后尽可能匹配一组bcd, 接着会进一步匹配bc,最后匹配b(每一步的最后都会匹配b)。(注意:只是前一个字符重复多次,不是多字符,多字符要加上组匹配) |
+ | 任意次重复:对它前面的正则式匹配1到任意次重复。例如 ab+ 会匹配 'a' 后面跟随1个以上到任意个 'b' ,它不会匹配 'a' 。(注意:与*的区别是从1开始,而不是从0;) |
? | 0到1重复:对它前面的正则式匹配0到1次重复。 ab? 会匹配 'a' 或者 'ab' 。(注意:(.+?)代表任意字符(.)不断重复(+)并且对他的组合一直重复(?)) |
{} | m个重复:表示为{m},对其之前的正则式指定匹配 m 个重复;少于 m 的话就会导致匹配失败。比如, a{6} 将匹配6个 'a' , 但是不能是5个。 |
[] | 集合匹配:用于指定字符类,它是你希望匹配的一组字符。例如, [abc] 将匹配任何字符 a 、 b 或 c ;因为它是一个范围的字符,可以简写成 [a-b];元字符在 [ ] 中变成普通字符,如$字符。特殊的,元字符^放在[ ] 第一位,依旧具有其特殊含义。(注意:^在[]里依旧特殊) |
\ | 也许最重要的元字符是反斜杠,
\W 匹配任何非字母与数字字符;这相当于类 \d 匹配任何十进制数字;这等价于类 \D 匹配任何非数字字符;这等价于类 \s 匹配任何空白字符;这等价于类 \S 匹配任何非空白字符;这相当于类 \A 仅匹配字符串的开头。 当不在 \Z 只匹配字符串尾。 \b 字边界。 这是一个零宽度断言,仅在单词的开头或结尾处匹配。 单词被定义为一个字母数字字符序列,因此单词的结尾由空格或非字母数字字符表示。 \B 另一个零宽度断言,这与 |
| | 或匹配:或运算符。 如果 A 和 B 是正则表达式, 要匹配字面 |
() | 分组匹配:组由 '(' ,')' 元字符标记。 '(' 和 ')' 与数学表达式的含义大致相同;它们将包含在其中的表达式组合在一起,你可以使用重复限定符重复组的内容,例如 * ,+ ,? 或 {m,n} 。 例如,(ab)* 将匹配 ab 的零次或多次重复。'(ab)*'的匹配结果,如'ababababab'的位置是(0, 10) 。(注意:如果使用了分组分配,那么分组也会作为子集返回) |
2、应用匹配
方法 / 属性 | 目的 |
---|---|
| 确定正则是否从字符串的开头匹配。 |
| 扫描字符串,查找此正则匹配的任何位置。 |
| 找到正则匹配的所有子字符串,并将它们作为列表返回。 |
| 找到正则匹配的所有子字符串,并将它们返回为一个 iterator。 |
| 返回正则匹配的字符串 |
| 返回匹配的开始位置 |
| 返回匹配的结束位置 |
| 返回包含匹配 (start, end) 位置的元组 |
3、编译标志
编译标志允许你修改正则表达式的工作方式。 标志在 re 模块中有两个名称,长名称如 IGNORECASE
和一个简短的单字母形式,例如 I
。 (如果你熟悉 Perl 的模式修饰符,则单字母形式使用和其相同的字母;例如, re.VERBOSE 的缩写形式为 re.X。)多个标志可以 通过按位或运算来指定它们;例如,re.I | re.M
设置 I
和 M
标志。
标志 | 含意 |
---|---|
| 使几个转义如 |
| 使 |
| 进行大小写不敏感匹配。 |
| 进行区域设置感知匹配。 |
| 多行匹配,影响 |
| 启用详细的正则,可以更清晰,更容易理解。 |