常用 regex 方言总结
主要考虑的 regex 方言:
- vim 的 nomagic
- python 的 re,无 flags
- sed + GNU extension
- GNU grep
- rg: 同 rust
控制流
含义 | vim | sed | grep | python | rg |
---|---|---|---|---|---|
中缀选择 | \| |
\| |
\| |
| |
| |
重复 >= 0 次 | * |
* |
* |
* |
* |
重复 >= 1 次 | \+ |
\+ |
\+ |
+ |
+ |
nongreedy, 重复 >= 0 次 | \{-} |
\/ |
无 | *? |
*? |
0 或 1 次 | \? |
\? |
\? |
? |
? |
重复 10 次 | \{10} |
\{10} |
\{10\} |
{10} |
{10} |
特殊字符
含义 | vim | sed | grep | python | rg |
---|---|---|---|---|---|
任意字符 (不含换行) | . |
无 | . |
. |
. |
任意字符 (含换行) | \_. |
. |
无 | 使用 re.M |
使用 s flag 如 (?s:.) |
行/输入的开头 | ^ |
^ |
^ |
^ |
^ |
行/输入的末尾 | $ |
$ |
$ |
$ |
$ |
分组 | \(REGEX\) |
\(REGEX\) |
\(REGEX\) |
(REGEX) |
(REGEX) |
后引用 | \n , 且 n >= 1 |
\n |
\n |
\n |
无 |
词开始 | \< |
\< |
\< |
无 | 无 |
词结束 | \> |
\> |
\> |
无 | 无 |
词开始或结束 | 无 | \b |
\b |
\b |
\b |
字符类
含义 | vim | sed | grep | python | rg |
---|---|---|---|---|---|
数字 | \d |
[[:digit:]] |
[[:digit:]] |
\d |
\d |
字母和数字, 以及下划线 | \w |
\w |
\w |
\w |
\w |
空白 (不含换行) | \s |
\s |
\s |
\s |
\s |
非空白 | \S |
\S |
\S |
\S |
\S |
abcd 字符之一 | [abcd] |
[abcd] |
[abcd] |
[abcd] |
[abcd] |
任一非 abcd 字符 | [^abcd] |
[^abcd] |
[^abcd] |
[^abcd] |
[^abcd] |
0 到 6 | [0-6] |
[0-6] |
[0-6] |
[0-6] |
[0-6] |
如果一个字符原原本本地作为了特殊字符, 那么需要反斜杠转义表示它自己.
vim 的 verymagic, magic 和 nomagic, grep 的 -E 和 -G
vim 加上 very magic 后 (通过在模式中加入 \v
) 后, 以下操作不用反斜杠 escape
|
+
?
{N}
(REGEX)
grep 加上 -E 之后, 以下操作不用反斜杠 escape
|
+
?
{N}
(REGEX)
python 的 re 用法
- 首先确定 pattern,然后编译称一个 ptn
p = re.compile(r'(\w\w)\.\.\.\1')
t = 'aa...aa**bb...bb'
- 然后对于某一个 text 做一系列操作
p.search(t) is not None # 判断 t 中是否存在 p (bool) p.findall(t) # 找出 t 中所有 p 的出现 (list str) p.sub(r, t) # 替换 t 中 p 为 r (str)
- 取得 match 对象之后
m = p.search(t) # 返回第一个 match 对象 m.span(n) # n 是匹配 group 号, 返回这个 group 的下标范围 m.group(n) # n 是匹配 group 号, 返回这个 group 的匹配字符串