限定符 | 说明 |
[] | 匹配方括号内的任意1个或者多个字符 |
[-] | 匹配方括号内的范围内的任意字符 |
[^] | 匹配方括号内单个字符之外的任意字符,不能实现不匹配字符串 |
a|b | 匹配字符a或者b |
() | 匹配圆括号内的表达式 |
预定义 | 说明 |
. | 匹配除了换行符"\n"之外的任意字符 |
\d | 匹配0-9之间任意字符,相当于 [0-9] |
\D | 匹配0-9之外任意字符,相当于 [^0-9] |
\w | 匹配任意字母、数字、下划线,相当于 [a-zA-Z0-9] |
\W | 匹配除了字母、数字、下划线之外的字符,相当于 [^a-zA-Z0-9] |
\s | 匹配空格、换行、制表符,相当于 [\t\r\n\v\f] |
\S | 匹配除了空格、换行、制表符之外的字符,相当于 [^\t\r\n\v\f] |
\n | 匹配换行符 linefeed |
\r | 匹配回车符 carriage return |
\t | 匹配制表符 tab |
\v | 匹配垂直制表符 vertical return |
数量限定符 | 说明 |
+ | 紧跟它前面的字符,匹配 1 或者 更多次 |
? | 紧跟它前面的字符,匹配 0 或者 1次 |
* | 紧跟它前面的字符,匹配 0 或者 更多次 |
{n} | 匹配n次 |
{n,} | 匹配n次或者更多次 |
{n,m} | 匹配n到m次 |
位置限定符 | 说明 | 举例 |
^ | 匹配行首 | |
$ | 匹配行尾 | |
\< | 匹配单子开头的位置 | \<th 匹配 this 但是不配 ethernet |
\> | 匹配单子结尾的位置 | \>er 匹配 father 但是不配 ethernet |
/b | 匹配单子开头或结尾的位置 | /bat/b 匹配 at 但是不匹配 atexit cat batch |
/B | 不匹配单子开头或结尾的位置 | /Bat/B 匹配 batch 但是不匹配 attend hat |
Python脚本举例1:
在设备配置文件中想要匹配出如下配置段,但是vsi的名称需要fbb开头,但是不能包含oam
#
vsi fbb_service
description ** 123 **
pwsignal ldp
vsi-id 12345678
peer 1.2.3.4
peer 1.2.3.4 pw abc
peer 1.2.3.5
peer 1.2.3.5 pw bcd
tnl-policy TE
isolate spoken include-multicast
#
就可以使用如下正则表达式:
import re
#
s = '^#$\n' + '^vsi fbb((?!oam)[^\n])*$\n' + '(^([^#])*$\n)+' + '^#$\n'
re_vsi_fbb_conf = re.compile(s, re.I | re.S | re.M)
#
解释如下:
1. ^#$\n 匹配第一行的#号:
^匹配行首,$匹配行尾,\n匹配换行
2. ^vsi fbb((?!oam)[^\n])*$\n 匹配第二行vsi fbbxxxxx,但是xxxxx内不能包含oam这个字符串:
(?!oam) 逆向查找不能包含oam,[^\n]不匹配换行,()*匹配括号内表达式0次或多次
3. (^([^#])*$\n)+ 匹配一行或者多行,但是不匹配#号:
([^#])* 匹配除了#号的任意字符0次或者多次,^匹配行首,$匹配行尾,\n匹配换行
()+ 匹配括号内表达式1次或多次
4. ^#$\n 匹配最后一行的#号:
^匹配行首,$匹配行尾,\n匹配换行
5. Python re 正则表达式的修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志
修饰符 | 描述 |
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 给予你更灵活的格式以便你将正则表达式写得更易于理解 |
Python脚本举例2:
在设备配置文件中想要匹配出某一行以vsi fbb开头的,就可以使用如下正则表达式:
#
s = '^vsi fbb([^\n])*$\n'
re_vsi_fbb = re.compile(s, re.I | re.S | re.M)
#