【问题标题】:Extract text between two strings if a substring exists between the two strings using Regex in Python如果两个字符串之间存在子字符串,则在 Python 中使用 Regex 提取两个字符串之间的文本
【发布时间】:2020-10-07 17:27:00
【问题描述】:

我有一个文本文件,如果这两个字符串之间存在子字符串,我想提取两个字符串之间的文本。文本文件中可能有多个这样的实例。例如,

示例文本文件(text_data)

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 = 'substring 1'

target3 = 'EndString'

pat1 = '{}(.+?){}(.+?){}'.format(target1,target2,target3)

pattern = re.compile(pat1, flags=re.DOTALL)

first_variable = pattern.findall(text_data)

谁能帮助我了解问题所在/为此提供解决方案?谢谢

【问题讨论】:

  • 这看起来是个逻辑问题,你不是要使用pat1 = '{}(.+?){}(.+?){}'.format(target1,target3,target2)吗?但是,这是一个错误的模式,你需要pat1 = '{0}((?:(?!{0}).)+?){1}(.+?){2}'.format(target1,target3,target2)
  • 谢谢,我已编辑问题以更正它。您提供的解决方案也不起作用。我试图理解它。有什么学习python Regex的学习资料推荐吗?
  • ideone.com/mYKuXh,什么不起作用?
  • 输出文本中缺少 'substring 1'。我对其进行了修改以使用其中包含 900K 行的实际文本文件,但它不起作用。我认为我做错了什么,我需要弄清楚
  • 试试pat1 = '{0}\s*((?:(?!{0}).)*?{1}.*?)\s*{2}'.format(target1,target2,target3),见ideone.com/fX4zhK

标签: python regex


【解决方案1】:

您可以使用修复代码

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

模式(见demo)是

StartString\s*((?:(?!StartString).)*?substring 1.*?)\s*EndString

详情

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

Python demo

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']

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 1970-01-01
    • 2015-05-10
    • 2013-01-31
    • 2013-12-11
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多