输入字符串:
-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,所以它不匹配,与第三行类似的问题
可以编写一个可以给出预期结果的表达式? ,任何帮助都会很棒
答案 0 :(得分:1)
您可以使用
捕获这些值#(?:\[+\d+]+)*\[*([^][()]+)
请参见regex demo
详细信息
#
-井号(?:\[+\d+]+)*
-0次或多次重复:
\[+
-1个以上的[
字符\d+
-1个以上数字]+
-1个以上的]
字符\[*
-0 + [
个字符([^][()]+)
-第1组:除了(
,)
,[
和]
以外的一个或多个字符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