正则表达式以使字符具有特定的样式

时间:2019-02-04 13:55:33

标签: regex python-3.x

输入字符串:

-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,所以它不匹配,与第三行类似的问题

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

2 个答案:

答案 0 :(得分:1)

您可以使用

捕获这些值
#(?:\[+\d+]+)*\[*([^][()]+)

请参见regex demo

详细信息

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

Python demo

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

答案 1 :(得分:0)

假设匹配的字符串应在找到结束]或开始(字符之前结束。这是有效的正则表达式:

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

它在提供的样本上起作用,而没有在要提取的文本中假设空格或下划线。这是一个演示链接:https://regexr.com/47muk