我试图找到一个正则表达式来获取解释一:和解释二:
之间的文本技巧是文本可能存在也可能不存在,它可能与解释一在同一行,也可能在解释一的下一行。下面代码中的当前正则表达式在解释二之前找到文本后添加了一行:
任何指示赞赏只是让文本忽略额外的空行。
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
答案 0 :(得分:2)
要匹配说明一:和解释二之间的文本:您可以使用DOTALL
标记在组中捕获它,或使用内联modifier (?s)
使点匹配换行符。
Explanation One:\s*(.*?)\s*Explanation Two
<强>解释强>
Explanation One:
按字面意思匹配\s*
匹配空白字符的零或次(.*?)
在群组中捕获零个或多个非贪婪的角色\s*
匹配空白字符的零或次Explanation Two
按字面意思匹配答案 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
顺便提一下,另一种方法是保持当前模式不变,并将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)