首页 > 解决方案 > 正则表达式在字符后获取特定模式

问题描述

输入字符串:

-line[8qWWQ5-swd-WER-DWDS]]<-SUCCESS#[14][MY_SAMPLE_TEST]
-line[8qWWQ5-swd-WER-DWDS]]<-SUCCESS#[4][MY_SAMPLE_TEST2]
-line[8qWWQ5-swd-WER-DWDS]]<Failed#[17][[14]SERVERERROR(TYPE-241)

预期输出:

MY_SAMPLE_TEST
MY_SAMPLE_TEST2
SERVERERROR

我的正则表达式: (?<=#).*

上面的正则表达式我可以得到 # 之后的所有内容,我也尝试过:

rex = (?<=#\[...\[).*(?=])

这给了我第一行的正确输出,即:MY_SAMPLE_TEST,但由于第二行只有一个数字,即 4,所以它不匹配,与第三行类似的问题

是否可以编写一个可以给出预期输出的表达式?, 任何帮助都会很棒

标签: regexpython-3.x

解决方案


您可以使用以下方法捕获这些值

#(?:\[+\d+]+)*\[*([^][()]+)

查看正则表达式演示

细节

  • #- 一个井号
  • (?:\[+\d+]+)*- 0次或多次重复:
    • \[+- 1+[个字符
    • \d+- 1+ 位数
    • ]+- 1+]个字符
  • \[*- 0+ 个[字符
  • ([^][()]+)(- 第 1 组:除、和)之外的一个或多个字符[]

Python演示

import re
strs = ['-line[8qWWQ5-swd-WER-DWDS]]<-SUCCESS#[14][MY_SAMPLE_TEST]', '-line[8qWWQ5-swd-WER-DWDS]]<-SUCCESS#[4][MY_SAMPLE_TEST2]', '-line[8qWWQ5-swd-WER-DWDS]]<Failed#[17][[14]SERVERERROR(TYPE-241)']
rx = re.compile(r'#(?:\[+\d+]+)*\[*([^][()]+)')
for s in strs:
    m = rx.search(s)
    if m:
        print(m.group(1))

输出:

MY_SAMPLE_TEST
MY_SAMPLE_TEST2
SERVERERROR

推荐阅读