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

Matching newline and any character with Python regex

我有这样的文字

var12.1
a
a
dsa

88
123!!!
secondVar12.1

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

如何使用正则表达式转储它?
我正在尝试这样的事情但无济于事:

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

您可以通过以下方式获取它:

var\d+(?:(?!var\d).)*?secondVar

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

注意: 最接近的匹配项 将被匹配,因为 (?:(?!var\d).)*? (即如果您有另一个 var + var 之后的一个数字 + 1+ 个数字然后匹配将在第二个 varsecondVar.

之间

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

正则表达式解释

  • var - 匹配起始分隔符
  • \d+ - 1+ 位数
  • (?:(?!var\d).)*? - 匹配任何字符的缓和贪婪标记,0 次或多次(但尽可能少)重复,不启动字符序列 var 和数字
  • secondVar - 按字面匹配 secondVar

IDEONE DEMO

import re
p = re.compile(r'var\d+(?:(?!var\d).)*?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(p.findall(test_str))

输入字符串的结果(出于演示目的我将其加倍):

['12.1\na\na\ndsa\n\n88\n123!!!\n', '12.1\na\na\ndsa\n\n88\n123!!!\n']

您正在寻找 re.DOTALL 标志,其正则表达式如下:var(.*?)secondVar。此正则表达式将捕获 varsecondVar.

之间的所有内容