正则表达式学习笔记(持续更新)

基础部分

  • 工具:egrep. egrep '[regular expression]' filename

行首行尾

1
2
3
4
5
6
^ : 标记一行的开始位置
$ : 标记一行的结束位置

# 例子
^cat : 匹配以cat为行首的行,例如 catter
cat$ : 匹配以cat为结尾的行,例如 scat

字符类

匹配任意字符

1
2
3
4
5
6
[...] : 匹配中括号中的任意一个字符,中括号称为字符类

# 例子
gr[ea]y : 匹配 grey 或 gray, r 和 y 之间可以是e或者a
sep[ea]r[ea]te : 匹配 seperate 或 separete 或 separate 或 seperete
<H[123456]> : 匹配 <H1> 到 <H6>, 在html匹配中常见
1
2
3
4
5
- : 划定字符范围

# 例子
[1-6]=[123456]
[0-9a-fA-F]=[0123456789abcdefABCDEF]

否定字符类

1
2
3
4
5
[^...] : 匹配任意不在中括号中的字符,与 [...] 相反

# 例子:
[^1-6] : 匹配不在 1-6 中的字符
q[^u] : 匹配包含 q~, 其中 ~ 为不是字母u的其他字符的所有行
  • 当 ^ 在中括号外面时表示行首标识符;当 ^ 在中括号里面时表示否定运算符

使用 ‘.’ 匹配 任意 字符

1
2
3
4
5
6
. : 匹配任意字符
[.] : 无转义,匹配dot

# 例子:
03.19.76 : 匹配 03~19~76,其中~可以是任意字符
03[-./]19[-./]76 : 以分隔符 . - 或 / 匹配 031976

多个正则表达式

  • 考虑如何将多个正则表达式结合到一起
1
2
3
4
5
| : 或运算, a | b 表示匹配正则表达式或正则表达式b。为了限定或运算范围,必要时用小括号括起来,例如 (a|b)

# 例子
gr(a|e)y = gr[ae]y
^(From|Subject|Date): 匹配以From:或Subject:或Date:开头的行

使用’?’匹配可选字符

  • 考虑匹配 colour 或 color,这里的 u 可选出现或不出现
1
2
3
4
? : 可选运算,u? 表示匹配出现u或不出现u,作用对象为?的前一个字符

# 例子
colou?r = (color|colour)

匹配重复字符

  • 考虑一个字符重复多次: goooooooooooooooooood!,但是次数不定
1
2
3
4
5
6
7
8
+ : 匹配一个字符1次或多次(至少1次)
* : 匹配一个字符0次或多次(至少0次)

# 例子:
goo+d: 匹配good,goood,goo...od
goo*d: 匹配god, good, ...
<HR +SIZE *= *[0-9]+ *>: 空格可以出现任意多次

运算符 字符最小出现次数 字符最大出现次数
? 0 1
+ 1 无限
* 0 无限

自定义字符重复次数

1
2
3
4
u{min, max} : 匹配字符u最小重复min次,最大重复max次。尽可能多地统计

# 例子:
[a-zA-Z]{3,8}: 匹配38个连续出现的英文字母(尽可能多)

Python re 模块要点

转义字符

  • 上述正则表达式规则基于Linux的egrep。针对Python的re模块,另有一些重要的转义字符可以用
字符 功能
\d 匹配数字,即[0-9] 可以写在字符集[…]中
\D 匹配⾮数字,即不是数字 可以写在字符集[…]中
\s 匹配空⽩,即空格,tab键 可以写在字符集[…]中
\S 匹配⾮空⽩字符 可以写在字符集[…]中
\w 匹配单词字符,即[a-zA-Z0-9_] 可以写在字符集[…]中
\W 匹配⾮单词字符 可以写在字符集[…]中

re 模块常用函数及注意事项

待补充
{:.warning}

练习:常用正则表达式(Python re格式)

  • 电子邮箱 \w{1,10}\.?\w{1,10}@(163|gmail|qq).com
  • 日期 \d{4}[.-/]\d{2}[.-/]\d{2}
  • HTTP/HTML URL \<http://[^ ]+\.html?\>

参考资料