【问题标题】:extract specific text using multiple regex in python?在python中使用多个正则表达式提取特定文本?
【发布时间】:2015-03-12 15:04:54
【问题描述】:

我在 python 3 中使用正则表达式时遇到问题,所以如果有人可以帮助我,我会很高兴。我有一个像下面这样的文本文件:

Header A
text text
text text
Header B
text text
text text
Header C
text text
here is the end

我想做的是在标题之间列出一个文本列表,但包括标题本身。 我正在使用这个正则表达式:

 re.findall(r'(?=(Header.*?Header|Header.*?end))',data, re.DOTALL)

结果在这里

['Header A\ntext text\n text text\n Header', 'Header B\ntext text\n text text\n Header', 'Header C\n text text here is the end']

问题是我在列表中每个项目的末尾得到下一个标题。如您所见,当我们找到下一个标头时,每个标头都会结束,但最后一个标头不会以特定方式结束

有没有办法使用正则表达式获取每个标题的列表(不是元组),包括它自己的文本作为子字符串?

【问题讨论】:

    标签: python regex extract


    【解决方案1】:
    Header [^\n]*[\s\S]*?(?=Header|$)
    

    试试这个。查看演示。

    https://regex101.com/r/iS6jF6/21

    import re
    p = re.compile(r'Header [^\n]*[\s\S]*?(?=Header|$)')
    test_str = "Header A\ntext text\ntext text\nHeader B\ntext text\ntext text\nHeader C\ntext text\nhere is the end"
    
    re.findall(p, test_str)
    

    【讨论】:

    • 是的,这也是正确的!谢谢 vks,正如我在另一条评论中所说的,我想我必须再次阅读正则表达式才能了解它们的工作原理!
    【解决方案2】:

    怎么样:

    re.findall(r'(?=(Header.*?)(?=Header|end))',data, re.DOTALL)
    

    【讨论】:

      【解决方案3】:

      您实际上需要使用积极的前瞻断言。

      >>> s = '''Header A
      text text
      text text
      Header B
      text text
      text text
      Header C
      text text
      here is the end'''
      >>> re.findall(r'Header.*?(?=Header)|Header.*?end',s, re.DOTALL)
      ['Header A\ntext text\ntext text\n', 'Header B\ntext text\ntext text\n', 'Header C\ntext text\nhere is the end']
      

      在正向前瞻中包含\n,以免在每个项目的最后获得\n 字符。

      >>> re.findall(r'Header.*?(?=\nHeader)|Header.*?end',s, re.DOTALL)
      ['Header A\ntext text\ntext text', 'Header B\ntext text\ntext text', 'Header C\ntext text\nhere is the end']
      

      根据字符串Header之前存在的换行符将您的输入拆分。

      >>> re.split(r'\n(?=Header\b)', s)
      ['Header A\ntext text\ntext text', 'Header B\ntext text\ntext text', 'Header C\ntext text\nhere is the end']
      

      【讨论】:

      • 感谢 Avinash!这也是正确的!我想我必须阅读更多关于正则表达式的信息才能了解它们是如何工作的!非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多