使用Python正则表达式匹配换行符和任何字符

时间:2015-07-15 19:34:06

标签: python regex regular-language

我有一个像

这样的文字
  

var12.1
  一个
  一个
  DSA

  88个
  123个!
  secondVar12.1

varsecondVar之间的字符串可能不同(并且可能有不同的数量)。

如何使用regexp将其转储?
我正在尝试这样的事情无济于事:

re.findall(r"^var[0-9]+\.[0-9]+[\n.]+^secondVar[0-9]+\.[0-9]+", str, re.MULTILINE)

2 个答案:

答案 0 :(得分:3)

你可以抓住它:

var((?!var|secondVar).*?)secondVar

demo。此正则表达式必须使用re.S (or re.DOTALL) modifier,以便.可以匹配换行符。分隔符之间的文本将在第1组中。

注意:由于(?!var|secondVar)最接近的匹配将匹配(即如果您在var后有另一个var则匹配将在第二个varsecondVar之间。

注2:您可能希望使用\b字边界来匹配以它们开头的字词:\bvar((?!\bvar|\bsecondVar).*?)\bsecondVar

REGEX EXPLANATION

  • var - 匹配起始分隔符
  • (?!secondVar).*? - 匹配任何0个或更多(但尽可能少)未跟随secondVar
  • 的字符
  • secondVar - 字面匹配secondVar

IDEONE DEMO

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。此正则表达式将捕获varsecondVar之间的所有内容。