Python 2:正则表达式在两个字符串之间的任何地方获取文本

时间:2018-06-14 06:17:33

标签: regex python-2.7

我试图找到一个正则表达式来获取解释一:和解释二:

之间的文本

技巧是文本可能存在也可能不存在,它可能与解释一在同一行,也可能在解释一的下一行。下面代码中的当前正则表达式在解释二之前找到文本后添加了一行:

任何指示赞赏只是让文本忽略额外的空行。

import re

STRING="""Explanation One:
Blah Blah

Explanation Two: ndnlnlkn
"""

pattern = r'Explanation One:[\r\n ].*(?=Explanation Two:)+')'
regex = re.compile(pattern, re.IGNORECASE)
print regex.search(STRING).group()

输出:

Explanation One: 
Blah Blah

2 个答案:

答案 0 :(得分:2)

要匹配说明一:和解释二之间的文本:您可以使用DOTALL标记在组中捕获它,或使用内联modifier (?s)使点匹配换行符。

Explanation One:\s*(.*?)\s*Explanation Two

<强>解释

  • Explanation One:按字面意思匹配
  • \s*匹配空白字符的零或次
  • (.*?)在群组中捕获零个或多个非贪婪的角色
  • \s*匹配空白字符的零或次
  • Explanation Two按字面意思匹配

Regex demo

Demo Python

答案 1 :(得分:1)

您当前的方法存在的问题是您正在执行正则表达式的模式不是DOT ALL模式。这意味着.*匹配各行,这正是您希望它做的,直到达到Explanation Two:标记文本。解决此问题的一种方法是匹配以下内容:

[\s\S]*

这将匹配任何内容,空白或非空白,这意味着它将匹配所有内容甚至跨行。

pattern = r'Explanation One:([\s\S]*)(?=Explanation Two:)'
searchObj = re.search(pattern, STRING, re.M|re.I)
print searchObj.group(1)

Blah Blah

Demo

顺便提一下,另一种方法是保持当前模式不变,并将re.DOTALL标记添加到re.search调用。所以以下内容也应该有效:

pattern = r'Explanation One:(.*)(?=Explanation Two:)'
searchObj = re.search(pattern, STRING, re.M|re.I|re.DOTALL)
print searchObj.group(1)