我有一个电子书阅读器,不会将突出显示注释导出到epub文件中,所以我要编写一个Sigil插件来从阅读器导入注释并将它们放入epub文件中,以便我可以在台式计算机上阅读它。
这样做的天真方法是在python中对字符串使用replace
方法:
for html_id, href in bk.text_iter():
# read orignal html code from file
original_html = bk.readfile(html_id)
# modify html code
modified_html = original_html.replace('Every issue that comes up', '<span class="highlight">Every issue that comes up</span>')
这里有一个警告:我寻找的字符串可能是电子书阅读器上的连续文本,但可能在底层的html文件中包含html标签。
我想首先碰到这个问题不是我:是否有一个名称和方法用于搜索这些约束?获取文件中的字符串或位置列表将非常有用,这些文件中的字符串或位置总是与原始文本相加。
例:
<ul>
<li>Alfa Romeo</li>
<li>Mercedes</li>
<li>Volkswagen</li>
</ul>
我已经在电子书阅读器中突出显示了该列表,因此我搜索了
Alfa Romeo Mercedes Volkswagen
我的搜索功能会返回一个包含html文件中位置的列表,这样我就可以为每个文件添加span
标签。
<ul>
<li><span class="highlight">Alfa Romeo</span></li>
<li><span class="highlight">Mercedes</span></li>
<li><span class="highlight">Volkswagen</span></li>
</ul>
什么是允许在途中插入html标签和空格的这种类型的搜索?在python中有一个库例程吗?
你可以使用re
:
import re
def highlight(text, keywords, _class='highlight'):
return re.sub('|'.join(keywords), lambda x:f"<span class='{_class}'>{x.group()}</span>", text)
s = """
<ul>
<li>Alfa Romeo</li>
<li>Mercedes</li>
<li>Volkswagen</li>
</ul>
"""
print(highlight(s, ['Alfa Romeo', 'Mercedes', 'Volkswagen']))
输出:
<ul>
<li><span class='highlight'>Alfa Romeo</span></li>
<li><span class='highlight'>Mercedes</span></li>
<li><span class='highlight'>Volkswagen</span></li>
</ul>