Python 中的正则表达式(非常简单的)简介

2017/10/29

这是我在学习 SoloLearn 的 Python 版的时候做的笔记,非常简单,甚至于中英混杂。。

首先,在 Python 中使用正则表达式时,一定要注意模版需使用 “raw string”,即 r‘…’,避免模版中的一些特殊格式被当作 Python 字符串的特殊格式解析

Python 中的 Re 包

Python 中可以通过 re 这个内建的库来使用正则表达式 几个常用的方法有 1. match():从头开始匹配,返回第一个结果。使用举例:re.match(‘pattern’, ‘string’) 2. search():在整段文本内匹配,返回第一个结果 3. findall():在整段文本内匹配,以 list 的形式返回所有结果 4. finditer:与 findall(),只是结果以 tuple 的形式给出

正则表达式元字符

Escape Code 匹配内容
. (除了换行符外的)任意字符
^ 字符串开头
$ 字符串结尾
* 前一个单元总共重复 [0, ] 次
+ 前一个单元总共重复 [1, ] 次
前一个单元总共重复 0
{x,y} 前一个单元总共重复 [x, y] 次
| 或(看起来貌似和 […] 一样)
  1. The metacharacter * means “zero or more repetitions of the previous thing”. It tries to match as many repetitions as possible. The “previous thing” can be a single character, a class, or a group of characters in parentheses.
  2. {x,y} 表示前一个单元重复 x-y 次,闭区间,中间不能有空格,若 x 未给出则视为 0,y 未给出则视为 ∞。{0,} 表达的意思和 * 相同。

字符类

什么是字符类

形式如 [abc],可匹配abc中任意一个,在字符类中所有的元字符都将失去其特殊含义,(除了位于开头的 ^)

在字符类中使用范围

Character classes can also match ranges of characters. Some examples: The class [a-z] matches any lowercase alphabetic character. The class [G-P] matches any uppercase character from G to P. The class [0-9] matches any digit. Multiple ranges can be included in one class. For example, [A-Za-z] matches a letter of any case.

对字符类取反

将 ”^” 放在字符组方括号内的第一位可将字符类取反。比如,[^0-9a-z] 可匹配任意不是一位数字+一位小写字母的两位字符

字符组

什么是字符组

将模版中的部分字符串用括号包围,使其成为一个单元(整体),叫做字符组

group(s) 方法

The content of groups in a match can be accessed using the group function. A call of group(0) or group() returns the whole match. A call of group(n), where n is greater than 0, returns the nth group from the left. The method groups() returns all groups up from 1.

即输出被测字符串中到底是哪些片段被模式中的各个组匹配了

Example:

import re

pattern = r"a(bc)(de)(f(g)h)i"

match = re.match(pattern, "abcdefghijklmnop")
if match:
   print(match.group())
   print(match.group(0))
   print(match.group(1))
   print(match.group(2))
   print(match.groups())

Result:
>>>
abcdefghi
abcdefghi
bc
de
('bc', 'de', 'fgh', 'g')
>>>

两个特殊的字符组

命名组和不可寻址组:

Named groups have the format (?P…), where name is the name of the group, and … is the content. They behave exactly the same as normal groups, except they can be accessed by group(name) in addition to its number. Non-capturing groups have the format (?:…). They are not accessible by the group ~method~, so they can be added to an existing regular expression without breaking the numbering.

Special Sequences

They are written as a backslash followed by another character.

1. \n

n 为 1-99 的整数,表示前面一段的匹配结果中第 n 个组匹配到的内容(即 group(n))

2. \d, \s, and \w

These match digits, whitespace, and word characters respectively. In ASCII mode they are equivalent to [0-9], [ \t\n\r\f\v], and [a-zA-Z0-9_]. In Unicode mode they match certain other characters, as well. For instance, \w matches letters with accents. Versions of these special sequences with upper case letters - \D, \S, and \W - mean the opposite to the lower-case versions. For instance, \D matches anything that isn’t a digit.

注意 \w 可以匹配 “_”

3. \b

\b 匹配一种位置(所谓位置,它的长度为 0,比如 ab 中 a, b 之间的那一点就叫“位置”),这个位置的前后不能都为 \w。比如”a nice day“ 和 “” 都能被模版 “\b(nice)\b” 所匹配。

相反地,\B 匹配两边都是 \w 的一个位置 4. \A, \Z 分别匹配字符串开头和结尾,同 ^ 和 $