获取有限制的两个子字符串之间的字符串

时间:2015-08-03 07:52:14

标签: python regex string

我需要帮助使用正则表达式查找子字符串,从示例开始:

给出以下字符串:

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')

2 个答案:

答案 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

的问题