如何使用 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)
)。
我有 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)
)。