如何使用 re 模块替换父文本中重复片段中的文本?

How to replace text in repeated fragments inside parent text using re module?

我有 html 文件,其中包含重复的 code 标签:


<h3>Post header content</h3>

<p>
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cum, delectus.
</p>

<p>
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam culpa illo necessitatibus 
    officia sed totam. Aspernatur cupiditate debitis eos obcaecati! Dolores eveniet excepturi hic optio.
</p>

<code class="code">
$ pip install --no-cache-dir -r requirements.txt

</code>


<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. 
    Accusamus et hic neque, suscipit totam ullam.</p>


<code class="code">

// Linux
export FLASK_APP=app.py
export FLASK_ENV=development

// Windows
set FLASK_APP=app.py
set FLASK_ENV=development

</code>

<p>More text...</p>


我想找到所有 code 标签,用它们做一些刺操作和 return 到源字符串。 这是我的代码片段:

import re

def code2replace(code):
    # find all code fragments
    RE_CODE = r'<code[^>]+>(.*?)<\/code>'
    matches = re.finditer(RE_CODE, code, re.S)
    

    rs_text = ''
    code_text = ''
    pos_start = 0

    for match in matches:
        # print(f'Start: {match.start()}, End: {match.end()}, Content: {match.group(1)}')
        code_text = match.group(1).replace('\n', '\n<br/>')

        rs_text += code[pos_start: match.start()] + f'<code class="code">{code_text}</code>'
        pos_start = match.end()

    return rs_text


但不幸的是,这无法正常工作。

那么,如何更改 code 标签的内容 html 和 return 更改结果?

它正在工作。在输出中注释(用于调试)。

0: regex finds this block at first and updates \n with \n<br/>
<br/>$ pip install --no-cache-dir -r requirements.txt
<br/>
<br/>
1: then regex finds this block and updates \n with \n<br/>
<br/>
<br/>// Linux
<br/>export FLASK_APP=app.py
<br/>export FLASK_ENV=development
<br/>
<br/>// Windows
<br/>set FLASK_APP=app.py
<br/>set FLASK_ENV=development
<br/>
<br/>

完整输出:

<h3>Post header content</h3>

<p>
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cum, delectus.
</p>

<p>
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam culpa illo necessitatibus
    officia sed totam. Aspernatur cupiditate debitis eos obcaecati! Dolores eveniet excepturi hic optio.
</p>

<code class="code">
<br/>$ pip install --no-cache-dir -r requirements.txt
<br/>
<br/></code>


<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.
    Accusamus et hic neque, suscipit totam ullam.</p>


<code class="code">
<br/>
<br/>// Linux
<br/>export FLASK_APP=app.py
<br/>export FLASK_ENV=development
<br/>
<br/>// Windows
<br/>set FLASK_APP=app.py
<br/>set FLASK_ENV=development
<br/>
<br/></code>

您的代码似乎确实有效,但使用 re.sub 而不是 re.finditer 可以显着简化代码,因此您不必从头到尾拼凑全文单场比赛排名:

def code2replace(html):
    def fix_code(match):
        code = match.group(1).replace("\n", "\n<br>")
        return f'<code class="code">{code}</code>'
    RE_CODE = r'<code[^>]+>(.*?)<\/code>'
    return re.sub(RE_CODE, fix_code, html, flags=re.S)

所有这些也可以用 lambda 在一行中完成,但我认为这种方式更具可读性和可扩展性。就像您的代码一样,这将取代例如第一个代码块:

<code class="code">
<br>$ pip install --no-cache-dir -r requirements.txt
<br>
<br></code>

请注意,这还将用相同的 <code> 标签替换任何开始的 <code> 标签,忽略任何其他属性或不同的 class 值。要保留原始的 <code> 标签,您可以只 return match.group().replace("\n", "\n<br>") 代替(group(),而不是 group(1))。