【问题标题】:How to properly capture multiple lines between two patterns如何正确捕获两个模式之间的多条线
【发布时间】:2020-09-11 14:32:52
【问题描述】:

我有一个 html 文件,我试图在其中搜索一个模式,当我找到它时,打印设置模式之间的所有行。在我的情况下,它是“pre 和 /pre”之间的所有内容,其中包含一个词干循环序列。我的目标是对大量的 html 文件进行排序并提取这些结构并将它们放在一个列表中,该列表可以像在 html 文件中出现的那样打印出来。我无法正确捕获所有线条并正确打印它们,因为它会出现在图片中。目前我只打印了两行,pre cugcaggcagaaguggggcugaca /pre 和 pre ccucaccccccuucugccugca /pre

为什么它没有捕获图案中的所有内容并正确打印?它正在跳过跨度和跨度类。我不确定我是否正确解决了这个问题——有没有更好的方法来考虑这个问题?谢谢

fh_html = open("filename").readlines()
for line in fh_html:

    match_obj = re.search(r'<pre>.*</pre>', line, re.DOTALL)
    print(match_obj.group(0))

这是 html 代码在页面上的样子: \这是代码的样子:

<pre>ggggc             <span class="sld">u</span>   - <span class="sld">c</span>   <span class="sld">ca</span>    agag 
     <span class="sld">cugcaggcagaag</span> <span class="sld">ggg</span> <span class="sld">g</span> <span class="sld">uga</span>  gggc    g
     ||||||||||||| ||| | |||  ||||     
     g<span class="sld">acguccgucuuc</span> <span class="sld">ccc</span> <span class="sld">c</span> <span class="sld">acu</span>  cccg    g
-----             -   <span class="sld">a</span> <span class="sld">c</span>   <span class="sld">cc</span>    cguu </pre>

这是代码:

【问题讨论】:

    标签: python regex html-parsing


    【解决方案1】:

    您将每个单独的行传递给正则表达式,而不是整个文本。

    试试这个:

    text = open("filename").read()
    match_obj = re.search(r'<pre>.*</pre>', text, re.DOTALL)
    print(match_obj.group(0))
    

    【讨论】:

    • 在这个示例中,我之前没有包含我的代码行,但是我需要执行几个操作,这需要我在 for 循环中逐行遍历文件。如何在不阅读整个文本的情况下捕获这些多行?我想我需要存储每一行​​,然后在打印出来时将它们全部加起来?此外,当我这样做时,它不会在第一次出现 /pre 时停止,而是在整个 html 文件的其余部分中继续,打印很多行。
    • 正则表达式默认是greedy,这意味着它们选择匹配最长的可能模式。如果您多次出现&lt;pre&gt;&lt;/pre&gt;,它将匹配从第一个&lt;pre&gt; 到最后一个&lt;/pre&gt; 的所有内容,并将中间的所有内容视为.* 的一部分模式。
    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 2019-09-28
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2019-11-19
    • 2014-03-13
    相关资源
    最近更新 更多