【问题标题】:Regular expression to get after character a specific pattern正则表达式在字符后获取特定模式
【发布时间】:2019-02-04 13:55:32
【问题描述】:

输入字符串:

-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

我的正则表达式:(?&lt;=#).*

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

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

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

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

【问题讨论】:

  • 尝试#[^a-zA-Z]*(\w+) 然后迭代第一个捕获组的值。在此处查看现场演示regex101.com/r/kSBxMM/1
  • 在最后一个示例字符串中的[17][14] 之间有一个额外的[。是不是打错字了?
  • @Gurman :不,那不是类型,
  • @revo 谢谢,快速回答,但如果 mt 匹配字符中有空格,即 MY_SAMPLE_TEST 也可以是 MY SAMPLE TEST
  • 然后使用#[^a-zA-Z]*([^][()]*)。在此处查看现场演示regex101.com/r/kSBxMM/2

标签: regex python-3.x


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    它适用于提供的示例,而无需在要提取的文本中假设空格或下划线。这是一个演示链接:https://regexr.com/47muk

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      相关资源
      最近更新 更多