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

Python 如何使用re模块替换父文本中重复片段中的文本?,python,replace,re,Python,Replace,Re,我有一个html文件,其中包含重复的code标记: 文章标题内容 Lorem ipsum dolor sit amet,奉献精英。嗯,代表团。 Lorem ipsum dolor sit amet,奉献精英。罪责不实 主持会议。阿珀那特铜酸debitis eos obcaecati!多洛丽丝·伊万尼特是个例外。 $pip安装--无缓存目录-r requirements.txt Lorem ipsum dolor sit amet,奉献精英。 阿库萨默斯和希克·内克,请转告我 //

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


文章标题内容

Lorem ipsum dolor sit amet,奉献精英。嗯,代表团。

Lorem ipsum dolor sit amet,奉献精英。罪责不实 主持会议。阿珀那特铜酸debitis eos obcaecati!多洛丽丝·伊万尼特是个例外。

$pip安装--无缓存目录-r requirements.txt
Lorem ipsum dolor sit amet,奉献精英。 阿库萨默斯和希克·内克,请转告我

//Linux 导出烧瓶_APP=APP.py 导出环境=开发 //窗户 设置烧瓶_APP=APP.py 设置烧瓶_ENV=开发 更多文本

我想找到所有的
code
标记,用它们进行一些sting操作并返回到源字符串。 这是我的代码片段:

重新导入
def代码2替换(代码):
#查找所有代码片段
RE_CODE=r']+>(.*)'
matches=re.finditer(re_代码,代码,re.S)
rs_text=“”
代码\文本=“”
pos_start=0
对于匹配中的匹配:
#打印(f'Start:{match.Start()},End:{match.End()},Content:{match.group(1)})
code_text=match.group(1).替换('\n','\n
) rs_text+=code[pos_start:match.start()]+f'{code_text}
' pos_start=match.end() 返回rs\u文本 但不幸的是,这不是正确的工作


那么,如何更改此html中
code
标记的内容并返回更改的结果呢?

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

0:regex首先找到此块,并使用\n更新\n

$pip安装--无缓存目录-r requirements.txt

1:然后regex找到此块并用\n更新\n


导出烧瓶\u APP=APP.py
导出烧瓶\u ENV=开发

设置烧瓶\u APP=APP.py
设置烧瓶_ENV=开发

全输出:

<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>
Post标题内容

Lorem ipsum dolor sit amet,奉献精英。嗯,代表团。

Lorem ipsum dolor sit amet,奉献精英。罪责不实 主持会议。阿珀那特铜酸debitis eos obcaecati!多洛丽丝·伊万尼特是个例外。


$pip安装--无缓存目录-r requirements.txt

Lorem ipsum dolor sit amet,奉献精英。 阿库萨默斯和希克·内克,请转告我



导出烧瓶\u APP=APP.py
导出烧瓶\u ENV=开发

设置烧瓶\u APP=APP.py
设置烧瓶_ENV=开发


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

0:regex首先找到此块,并使用\n更新\n

$pip安装--无缓存目录-r requirements.txt

1:然后regex找到此块并用\n更新\n


导出烧瓶\u APP=APP.py
导出烧瓶\u ENV=开发

设置烧瓶\u APP=APP.py
设置烧瓶_ENV=开发

全输出:

<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>
Post标题内容

Lorem ipsum dolor sit amet,奉献精英。嗯,代表团。

Lorem ipsum dolor sit amet,奉献精英。罪责不实 主持会议。阿珀那特铜酸debitis eos obcaecati!多洛丽丝·伊万尼特是个例外。


$pip安装--无缓存目录-r requirements.txt

Lorem ipsum dolor sit amet,奉献精英。 阿库萨默斯和希克·内克,请转告我



导出烧瓶\u APP=APP.py
导出烧瓶\u ENV=开发

设置烧瓶\u APP=APP.py
设置烧瓶_ENV=开发


您的代码看起来确实有效,但使用
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)

请注意,这也将用相同的
标记替换任何打开的
标记,忽略任何附加属性或不同的
值。要保留原始的
标记,您只需
返回match.group().replace(“\n”,“\n
”)
group()
,而不是
group(1)
)。

您的代码看起来确实有效,但使用
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)

请注意,这也将用相同的
标记替换任何打开的
标记,忽略任何附加属性或不同的
值。要保留原始的
标记,您可以
返回match.group()。替换(“\n”,“\n
”)
group()
,而不是
group(1)
)。

您考虑过使用合适的HTML解析器吗?FWIW我同意@tobias_k,使用正则表达式解析HTML通常被认为是一种糟糕的编程实践。您是否考虑过使用合适的HTML解析器?FWIW我同意@tobias_k,使用正则表达式解析HTML通常被认为是一种糟糕的编程实践。