如果在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
    -左侧分隔符
  • \s*
    -0+空格
  • ((?:(?!StartString)。)*?子字符串1.*?
    -第1组:
    • (?:(?!StartString)。*)*?
      -不以左手分隔符开头的任何字符,0或更多,但尽可能少
    • 子字符串1
      -第三个字符串
    • *?
      -任何0+字符,尽可能少
  • \s*EndString
    -0+空格和右侧分隔符
见:


您可以使用

pat1 = '{0}\s*((?:(?!{0}).)*?{1}.*?)\s*{2}'.format(target1,target2,target3)
模式(见)是

详细信息

  • StartString
    -左侧分隔符
  • \s*
    -0+空格
  • ((?:(?!StartString)。)*?子字符串1.*?
    -第1组:
    • (?:(?!StartString)。*)*?
      -不以左手分隔符开头的任何字符,0或更多,但尽可能少
    • 子字符串1
      -第三个字符串
    • *?
      -任何0+字符,尽可能少
  • \s*EndString
    -0+空格和右侧分隔符
见:


这看起来像是一个逻辑问题,您的意思是使用
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']