我有一个像
这样的文字var12.1
一个
一个
DSA
88个
123个!
secondVar12.1
var
和secondVar
之间的字符串可能不同(并且可能有不同的数量)。
如何使用regexp将其转储?
我正在尝试这样的事情无济于事:
re.findall(r"^var[0-9]+\.[0-9]+[\n.]+^secondVar[0-9]+\.[0-9]+", str, re.MULTILINE)
答案 0 :(得分:3)
你可以抓住它:
var((?!var|secondVar).*?)secondVar
见demo。此正则表达式必须使用re.S
(or re.DOTALL
) modifier,以便.
可以匹配换行符。分隔符之间的文本将在第1组中。
注意:由于(?!var|secondVar)
,最接近的匹配将匹配(即如果您在var
后有另一个var
则匹配将在第二个var
和secondVar
之间。
注2:您可能希望使用\b
字边界来匹配以它们开头的字词:\bvar((?!\bvar|\bsecondVar).*?)\bsecondVar
REGEX EXPLANATION
var
- 匹配起始分隔符(?!secondVar).*?
- 匹配任何0个或更多(但尽可能少)未跟随secondVar
secondVar
- 字面匹配secondVar
。import re
p = re.compile(r'var((?!var|secondVar).*?)secondVar', re.DOTALL)
test_str = "var12.1\na\na\ndsa\n\n88\n123!!!\nsecondVar12.1\nvar12.1\na\na\ndsa\n\n88\n123!!!\nsecondVar12.1"
print(re.findall(p, test_str))
输入字符串的结果(我为了演示目的将其加倍):
['12.1\na\na\ndsa\n\n88\n123!!!\n', '12.1\na\na\ndsa\n\n88\n123!!!\n']
答案 1 :(得分:1)
你正在寻找re.DOTALL
标志,正如这样的正则表达式:var(.*?)secondVar
。此正则表达式将捕获var
和secondVar
之间的所有内容。