Python2:Regex可以在两个字符串之间的任意位置获取文本
我正试图找到一个正则表达式来获取解释1:和解释2:之间的文本: 诀窍在于文本可能存在也可能不存在,它可能和解释一在同一行,也可能在解释一的下一行。下面代码中的当前正则表达式在找到解释2之前的文本后添加了一行: 任何指针都可以忽略额外的空行来获取文本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
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。