我需要帮助使用正则表达式查找子字符串,从示例开始:
给出以下字符串:
test_str = "start: 1111 kill 22:22 start: 3333 end"
我想在start和end之间提取不涉及kill的字符串:
wanted_result = (start: 3333 end)
注意:我需要获得start blablab end的所有匹配,否则它们之间没有杀死
几次尝试失败,最新的一次:
pattern = re.compile(r'start:(.+?)(([^kill])end)',flags = re.DOTALL)
results = pattern.findall(test_str)
导致不同的结果:
result = (' 1111 kill 22:22 start: 3333', ' end', ' end')
答案 0 :(得分:3)
您需要使用基于正面的负面预测。
pattern = re.compile(r'start:(?:(?!kill).)*?end',flags = re.DOTALL)
(?:(?!kill).)*?
会在匹配角色之前进行检查。它检查要匹配的字符是否为任何字符,但它不能是子字符串kill
的开头。
示例:强>
>>> import re
>>> test_str = "start: 1111 kill 22:22 start: 3333 end"
>>> pattern = re.compile(r'start:(?:(?!kill).)*?end',flags = re.DOTALL)
>>> pattern.findall(test_str)
['start: 3333 end']
答案 1 :(得分:1)
作为提示,您可能会注意到否定字符类将排除字符类不字符内的字符。为此目的,您需要使用negative look-ahead。
因此,您需要[^kill]
而不是(?!kill)
。
并阅读有关regular-expression-to-match-line-that-doesnt-contain-a-word
的问题