正则表达式笔记

例子

例1:

1
^[0-9]+abc$
  • ^为匹配字符串开始位置
  • [0-9]+为匹配多个数字,[0-9]匹配单个数字,+匹配一个或者多个
  • abc$匹配字母abc并以abc结尾,$为匹配输入字符串的结束位置。

例2:

1
^[a-z0-9_-]{3,15}$
  • ^为匹配字符串开始位置
  • [a-z0-9_-]为匹配字母、数字和下划线、横杆,{3,15}匹配三到十五个字符

语法

普通字符

非打印字符

反斜杠转义:\n换行符,\f换页符,\s匹配任何空白字符(包括空格、制表符、换页符等等。等价于[\f\n\r\t\v])。注:\cx-匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。

特殊字符

  • ( ):标记一个子表达式的开始和结束位置
  • [ ]:标记一个中括号表达式
  • { }:标记一个限定符表达式(次数)

:符合圆括号括住部分会被缓存下来。

  • |:或关系
  • .:匹配除换行符\n之外的任何单字符

限定符

  • *:匹配前面的子表达式零次或多次
  • +:匹配前面的子表达式一次或多次
  • ?:匹配前面的子表达式零次或一次
  • {n}:匹配确定的 n 次
  • {n,}:至少匹配 n 次
  • {n,m}:最少匹配 n 次且最多匹配 m 次(逗号前后不能空格)

*+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。

定位符

  • $:匹配结尾位置
  • ^:匹配开始位置 | 方括号表达式中使用,则表示不接受该字符集合
  • \b:匹配一个单词边界,即字与空格间的位置
  • \B:非单词边界匹配

\b字符的位置决定是匹配单词头还是单词尾。

:不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。

选择

  • (pattern):匹配 pattern 并获取这一匹配
  • (?:pattern):匹配 pattern 但不获取匹配结果
  • (?=pattern):正向肯定预查(look ahead positive assert)
  • (?!pattern):正向否定预查(negative assert)
  • (?<=pattern):反向(look behind)肯定预查
  • (?<!pattern):反向否定预查

元字符

  • x|y:匹配 x 或 y

  • [xyz]:字符集合

  • [^xyz]:负值字符集合

  • [a-z]:字符范围

  • [^a-a]:负值字符范围

  • \b:匹配一个单词边界

  • \B:匹配非单词边界

  • \cx:匹配由 x 指明的控制字符

  • \d:匹配一个数字字符

  • \D:匹配一个非数字字符

  • \f``\n``\r:换页符\换行符\回车符

  • \s:匹配任何空白字符,等价于[\f\n\r\t\v]

  • \S:匹配任何非空白字符

  • \t``\v:制表符\垂直制表符

  • \w:匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’。

  • \W:匹配非字母、数字、下划线

  • \xn:匹配 n,其中 n 为十六进制转义值 — \x41 -> A

  • \num:匹配 num,其中 num 是一个正整数

  • \n \nm \nml:标识一个八进制转义值或一个向后引用

  • \un:匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

替换

使用\1\2替换搜索到的字符串

例子:

要替换

1
* [the label](#the_anchor)

1
<h2 id="the_anchor">the label</h2>

使用

1
2
3
4
5
6
import fileinput
import re

for line in fileinput.input():
line = re.sub(r'\* \[(.*)\]\(#(.*)\)', r'<h2 id="\2">\1</h2>', line.rstrip())
print(line)