网上的相关资料非常多,但都很乱。于是我做了个分类,一来自己方便查看,二来看到此文章的同仁也能省去些麻烦。

提示:正则表达式中的 pattern 参数通常都包含反斜杠,为了防止它们被识别为转义字符,最好使用原始字符串 r'' 来表示它们。(如 r'\t',等价于 \\t )匹配相应的特殊字符。

使用原始字符串的优点是可以少写\号,代码阅读起来也更容易些。

正则表达式四大功能:匹配(bool值)、获取、替换、分割。

匹配单个字符

  • . :表示任意一个字符。如表达式't.o'too'two'都符合条件。
  • […]:匹配[]中列举的所有字符中的一个
    • 一个[]表示一个字符:[amk] 匹配 ‘a’,’m’或’k’。[a-zA-Z0-9]表示所有字母+数字。[A-Z][a-z]表示第一个字符为大写字母,第二个字符为小写字符,即两个字符。
    • 注意无需使用 , 分割内容,[0-35-9] 表示0~3与5~9。
    • 可以用 - 给出范围。如 [abc][a-c] 含义相同。
  • [^…]:不在[]中的字符中的一个
    • [^abc] 匹配除了a,b,c之外的字符。

匹配单个字符——它们可以写在字符集[]中

  • \w: 匹配数字字母下划线。等价于[a-zA-Z0-9_],在Unicode字符中还可以匹配汉字、全角数字。
  • \W:匹配非数字字母下划线,等价于[^A-Za-z0-9_]
  • \s:匹配任意空白字符、空格、tab键。等价于[\t\n\r\f]
  • \S:匹配任意非空字符,等价于[^\t\n\r\f]
  • \d:匹配任意数字,等价于 [0-9]
  • \D:匹配任意非数字,等价于[^0-9]

匹配多个字符

  • *:匹配*号前一个字符出现至少 0 次的表达式。如表达式abc*,匹配值ababccc
  • +:匹配前⼀个字符出现 1 次或者⽆限次。如表达式abc+,匹配值abcabccc
  • ?:匹配前⼀个字符出现 1 次或者 0 次,即要么有 1 次,要么没有。非贪婪。
  • {m}:匹配前⼀个字符出现 m 次。如表达式ab{2}c,匹配值abbc
  • {m,}:匹配前面表达式至少 m 次
  • {,n}:匹配前面的正则表达式最多 n 次
  • {m,n}:匹配前⼀个字符出现至少 m 至多 n 次。如表达式ab{1,3}c,匹配值abcabbcabbbc

特殊匹配

  • | :匹配左右任意一个表达式。如匹配0-100之间的数字,表达式re.match(r'[1-9]?\d$|100',string)
  • ():匹配括号内的表达式,也可表示一个组(整体),组与组之间联合使用。可以和|搭配,如识别邮箱时(163|126|qq)
  • \b:匹配单词边界。
    • \b是零宽度不占字符的,它是一个边界线的存在,在\b的左右两侧,要求一个是\w,一个是\W
    • 也就是用于匹配处在边界的字符,比如\bhe可以匹配"he"但不能匹配"where"。
    • \bman\b可以匹配"I am a man, not a woman" 中的man,而不会匹配woman;但man\b会匹配出manwoman,因为后者的"man"也处在边界,使用时要注意。
  • \B:匹配非单词边界。
    • \b相反,这样理解:在\B的左右两侧,要么全是\w,要么全是\W
    • py=\B可以匹配"py==“中的"py=",但不能匹配"py=1"中的"py="。
  • \n,\t,等:匹配一个换行符,匹配一个制表符, 等。

位置类

  • ^:匹配字符串的开头。
  • $:匹配字符串的末尾。
  • \A:匹配字符串开始。
  • \Z:匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
  • \z:匹配字符串结束。
  • \G:匹配最后匹配完成的位置。

实例

  • [Pp]ython:匹配 “Python” 或 “python”
  • rub[ye]:匹配 “ruby” 或 “rube”
  • [aeiou]:匹配中括号内的任意一个字母
  • [0-9]:匹配任何数字。类似于 [0123456789]
  • [a-z]:匹配任何小写字母
  • [A-Z]:匹配任何大写字母
  • [a-zA-Z0-9]:匹配任何字母及数字
  • [^aeiou]:除了aeiou字母以外的所有字符
  • [^0-9]:匹配除了数字外的字符

*:星号。匹配前一个字符0到n次,如'pytho\*n'可以匹配pythn、pythoon、pythooooon等。还有其它匹配重复字符的如?、+或{m,n},其中{n,m}可以灵活使用,它表示匹配n次到m次。

\b 的用法也可以很灵活,在给定的字符串中,找到以小写字母开头的单词。

ss = "i Am a gOod boy  baby!!"
result=re.findall(r'\b[a-z][a-zA-Z]*\b',ss)
print(result)