如果在Python中使用正则表达式在两个字符串之间存在子字符串,则在两个字符串之间提取文本
我有一个文本文件,如果两个字符串之间存在子字符串,我想在这两个字符串之间提取文本。文本文件中可能有多个这样的实例。比如说, 示例文本文件(文本数据):如果在Python中使用正则表达式在两个字符串之间存在子字符串,则在两个字符串之间提取文本,python,regex,Python,Regex,我有一个文本文件,如果两个字符串之间存在子字符串,我想在这两个字符串之间提取文本。文本文件中可能有多个这样的实例。比如说, 示例文本文件(文本数据): ghsauaigyssts twh ghguy hja StartString I want this text (1) if substring 1 lies in between the two strings EndString bhghk [jhbn] xxzh StartString I want this text (2) a
ghsauaigyssts twh
ghguy hja StartString I want this text (1) if substring 1 lies in between the two strings EndString bhghk [jhbn] xxzh StartString I want this text (2) as a different variable if substring 2 lies in between the two strings EndString ghjyjgu
输出:
first_variable=如果子字符串1位于两个字符串之间,则我需要此文本(1)
second_variable=如果子字符串2位于两个字符串之间,我希望此文本(2)作为不同的变量
我尝试将第一个变量提取为:
target1='StartString'
target2='子字符串1'
target3='EndString'
pat1='{}(.+?){}(.+?){}'。格式(target1、target2、target3)
pattern=re.compile(pat1,flags=re.DOTALL)
第一个变量=pattern.findall(文本数据)
有人能帮我理解问题所在/为我提供解决方案吗?谢谢您可以使用
pat1 = '{0}\s*((?:(?!{0}).)*?{1}.*?)\s*{2}'.format(target1,target2,target3)
模式(见)是
详细信息
-左侧分隔符StartString
-0+空格\s*
-第1组:((?:(?!StartString)。)*?子字符串1.*?
-不以左手分隔符开头的任何字符,0或更多,但尽可能少(?:(?!StartString)。*)*?
-第三个字符串子字符串1
-任何0+字符,尽可能少*?
-0+空格和右侧分隔符\s*EndString
您可以使用
pat1 = '{0}\s*((?:(?!{0}).)*?{1}.*?)\s*{2}'.format(target1,target2,target3)
模式(见)是
详细信息
-左侧分隔符StartString
-0+空格\s*
-第1组:((?:(?!StartString)。)*?子字符串1.*?
-不以左手分隔符开头的任何字符,0或更多,但尽可能少(?:(?!StartString)。*)*?
-第三个字符串子字符串1
-任何0+字符,尽可能少*?
-0+空格和右侧分隔符\s*EndString
这看起来像是一个逻辑问题,您的意思是使用
pat1='{}(.+?){}(.+?){}.format(target1,target3,target2)
?但是,这是一个错误的模式,您需要pat1='{0}((?:(?!{0})+?){1}(.+?){2}'。格式(target1,target3,target2)
谢谢,我已经编辑了问题以更正它。您提供的解决方案不起作用。不过我正在努力理解它。您是否推荐学习python正则表达式的学习材料?请参阅,输出文本中缺少什么不起作用的内容?“子字符串1”。我对它进行了修改,使其能够处理实际的文本文件,其中包含900K行,但它不起作用。我想我做错了什么,我需要找出pat1='{0}\s*(?:(?!{0})。*?{1}.*?\s*{2}.format(target1,target2,target3)
,这看起来像是一个逻辑问题,你不是想使用pat1='{}(.+?){}(.+?){}.format(target1,target3,target2)
?但是,这是一个错误的模式,您需要pat1='{0}((?:(?!{0})+?){1}(.+?){2}'。格式(target1,target3,target2)
谢谢,我已经编辑了问题以更正它。您提供的解决方案不起作用。不过我正在努力理解它。您是否推荐学习python正则表达式的学习材料?请参阅,输出文本中缺少什么不起作用的内容?“子字符串1”。我对它进行了修改,使其能够处理实际的文本文件,其中包含900K行,但它不起作用。我想我做错了什么,我需要找出pat1='{0}\s*((?:(?!{0})*?{1}.*?\s*{2})。格式(target1,target2,target3)
,请参阅
import re
text_data='ghsauaigyssts twh\n\nghguy hja StartString I want this text (1) if substring 1 lies in between the two strings EndString bhghk [jhbn] xxzh StartString I want this text (2) as a different variable if substring 2 lies in between the two strings EndString ghjyjgu'
target1 = 'StartString'
target2 = 'substring 1'
target3 = 'EndString'
pat1 = '{0}\s*((?:(?!{0}).)*?{1}.*?)\s*{2}'.format(target1,target2,target3)
pattern = re.compile(pat1, flags=re.DOTALL)
print(pattern.findall(text_data))
# => ['I want this text (1) if substring 1 lies in between the two strings']