Python2:Regex可以在两个字符串之间的任意位置获取文本

Python2:Regex可以在两个字符串之间的任意位置获取文本,regex,python-2.7,Regex,Python 2.7,我正试图找到一个正则表达式来获取解释1:和解释2:之间的文本: 诀窍在于文本可能存在也可能不存在,它可能和解释一在同一行,也可能在解释一的下一行。下面代码中的当前正则表达式在找到解释2之前的文本后添加了一行: 任何指针都可以忽略额外的空行来获取文本 import re STRING="""Explanation One: Blah Blah Explanation Two: ndnlnlkn """ pattern = r'Explanation One:[\r\n ].*(?=Expla

我正试图找到一个正则表达式来获取解释1:和解释2:之间的文本:

诀窍在于文本可能存在也可能不存在,它可能和解释一在同一行,也可能在解释一的下一行。下面代码中的当前正则表达式在找到解释2之前的文本后添加了一行:

任何指针都可以忽略额外的空行来获取文本

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

当前方法的问题是,执行regex的模式不是DOT-ALL模式。这意味着
*
在到达
说明二:
标记文本之前,不会跨行匹配,这正是您希望它执行的操作。解决此问题的一种方法是匹配以下内容:

[\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)

要在解释一:和解释二之间匹配文本,可以使用
DOTALL
标志在组中捕获文本,或者使用内联
(?s)
使点与换行符匹配

解释一:\s*(.*)\s*解释二

解释

  • 解释一:
    逐字匹配
  • \s*
    匹配零或乘以空格字符
  • (.*)
    在一个组中捕获零个或多个非贪婪字符
  • \s*
    匹配零或乘以空格字符
  • 解释二
    逐字匹配


谢谢,这很有效,我不得不添加?=从输出中排除解释二:不幸的是,(.*)如果解释一和解释二之间没有文本,则选择解释二作为文本。如果没有文本,是否可以只返回None。