元字符与转义
正则表达式的元字符包括: ^ $ . [ ] { } - ? * + ( ) |
元字符有着特殊的意义,当需要取消元字符的特殊含义时,需要在元字符之前加上反斜线字符 。
锚
^ 和 $ 在正则表达式中被当作锚,其中 ^ 匹配字符串的起始位置,$ 匹配字符串的结束位置。
任意字符
. 匹配除 之外的任意字符。
否定
如果中括号内的第一个字符是 ^,表示匹配不在指定字符集内的字符。
字符范围
- 字符连接的两个字符表示范围,例如 [0-9] 等价于 [0123456789]。需要注意的是:- 左边字符的码值要小于右边字符的码值。
或选项
regex1 | regex2 表示匹配 regex1 或 regex2。
实例
a) 判断字符串 str 是否以数字开头
>>> re.search(r"^[d][sS]*", str) != None;
b) 判断字符串 str 是否以小写字母结尾
>>> re.search(r"[sS]*[a-z]$", str) != None;
c) 匹配由空格隔开的字符串
>>> re.findall(r"[^ ]+", "long time no see"); ['long', 'time', 'no', 'see']
字符类简记法
d 等价于 [0-9],其中的 d 表示数字(digital)
D 等价于 [^d]
w 等价于 [0-9a-zA-Z],其中的 w 表示单词字符(word)
W 等价于 [^w]
s 等价于 [
vf],其中的 s 表示空白字符(space)
S 等价于 [^s]
实例
a) 匹配字符串中的数字
>>> re.findall(r"[d]+", "abc123def456"); ['123', '456']
b) 使用 [sS] 或 [dD]、[wW] 匹配任意字符,包括
>>> re.search("^[sS]+$", "!@#$%^&*()12345qwert") != None True
POSIX 字符类
POSIX 字符类 | 描述 | ASCII 字符类 |
[:alnum:] | 字母字符与数字字符 | [0-9A-Za-z] |
[:blank:] | 空格符与制表符 | [ ] |
[:cntrl:] | 控制字符 | [x00-x1Fx7F] |
[:digit:] | 数字字符 | [0-9] |
[:graph:] | 可见字符 | [x21-x7E] |
[:lower:] | 小写字母字符 | [a-z] |
[:print:] | 可打印字符,包括 [:graph:] 中所有字符再加上空格符 | [x20-x7E] |
[:punct:] | 标点符号字符 | |
[:space:] | 空白字符 | [ vf] |
[:upper:] | 大写字母字符 | [A-Z] |
[:word:] | 字母字符 | [0-9A-Za-z_] |
[:xdigit:] | 十六进制字符 | [0-9A-Fa-f] |
需要注意的是,有些语言不支持 POSIX 字符类,比如 Python、JavaScript 。Java 中,POSIX 字符类 [[:name:]] 必须使用 p{Name} 的形式,比如 [:space:] 当写作 p{Space},注意第一字母要大写,除了 [:xdigit:] 要写作 p{XDigit}。
量词
量词 | 含义 |
{n} | 前面的元素恰好出现 n 次则匹配 |
{m,n} | 前面的元素出现的次数在 n~m 次之间时则匹配 |
{m,} | 前面的元素出现次数超过 n 次则匹配 |
{,n} | 前面的元素出现次数不超过 m 次则匹配 |
* | 等价于 {0,} |
+ | 等价于 {1,} |
? | 等价于 {0,1} |
贪婪匹配与惰性匹配
实例
a) 贪婪匹配
>>> re.findall(r"<span>[sS]*</span>", "<div><span>abc</span><br><span>xyz</span></div>"); ['<span>abc</span><br><span>xyz</span>']
a) 惰性匹配
>>> re.findall(r"<span>[sS]*?</span>", "<div><span>abc</span><br><span>xyz</span></div>");
['<span>abc</span>', '<span>xyz</span>']