【问题标题】:Split text into sections using python regex使用 python 正则表达式将文本拆分为多个部分
【发布时间】:2014-01-30 16:21:47
【问题描述】:

我有一个大的、多行的字符串,其中包含遵循类似格式的多个条目。我想将它拆分为每个条目的字符串列表。

我尝试了以下方法:

myre = re.compile('Record\sTime.*-{5}', re.DOTALL)
return re.findall(myre, text)

在这种情况下,条目以“记录时间”开头,以“-----”结尾。上面的代码没有按照我的意愿行事,而是返回一个项目,从第一个条目的开头开始,到最后一个条目的结尾结束。

我可能会找到一种方法来完成这项工作,方法是使用正则表达式查找段的结尾,然后从那里开始重复一段原始文本,但这似乎很混乱。

【问题讨论】:

    标签: python regex text


    【解决方案1】:

    您需要通过添加问号将.* 变成不情愿 匹配:

    .*?
    

    否则它会尽可能匹配,从第一条记录的中间到最后一条记录的中间。

    Greedy vs. Reluctant vs. Possessive Quantifiers

    【讨论】:

      【解决方案2】:

      类似这样的:

      txt='''\
      Record Time
      1
      2
      3
      -----
      
      Record Time
      4
      5
      -----
      Record Time
      6
      7
      8
      '''
      
      import re
      pat=re.compile(r'^Record Time$(.*?)(?:^-{5}|\Z)', re.S | re.M)
      for i, block in enumerate((m.group(1) for m in pat.finditer(txt))):
          print 'block:', i
          print block.strip()
      

      打印:

      block: 0
      1
      2
      3
      block: 1
      4
      5
      block: 2
      6
      7
      8
      

      【讨论】:

        【解决方案3】:

        您可以使用它来避免不情愿的量词,这是模拟原子组的技巧:(?=(...))\1。它不完全在主题中,但它可能很有用:

        myre = re.compile('Record\sTime(?:(?=([^-]+|-(?!-{4})))\1)+-{5}')
        

        【讨论】:

          猜你喜欢
          • 2019-04-11
          • 2019-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 2022-11-12
          • 1970-01-01
          相关资源
          最近更新 更多