使用Python正则表达式查找和替换以在原始文本周围添加HTML标记

时间:2016-09-19 10:07:20

标签: python regex

我正在使用Flask构建一个简单的Web应用程序,我想知道是否可以使用正则表达式来查找和替换Fe2O3 + CO中的数字 - > Fe + CO2并用子HTML标签包围它们,因此它变成Fe 2 O 3 + CO - >在HTML中显示时,Fe + CO 2

2 个答案:

答案 0 :(得分:0)

尝试这样的事情,这里a是你的输入字符串。在不使用正则表达式的情况下实现。

In [1]: a = 'Fe2O3 + CO -> Fe + CO2'
In [2]: ''.join(['<sub>'+i+'</sub>' if i.isdigit() else i for i in a])
Out[1]: 'Fe<sub>2</sub>O<sub>3</sub> + CO -> Fe + CO<sub>2</sub>'

答案 1 :(得分:0)

我有类似的情况,但我想要一个更大数字和可能的同位素信息(以RDKit输出的格式)更健壮的正则表达式。这就是我想出的:

def html_formula(value):
    comps = re.split('([A-Z][a-z]?|\[\d+[A-Z][a-z]?\])(\d+)', value)
    html = ''.join(['<sub>{}</sub>'.format(i) if i.isdigit() else i for i in comps])
    return html

例如:

>>> html_formula('Fe2O3 + CO -> Fe + CO2')
'Fe<sub>2</sub>O<sub>3</sub> + CO -> Fe + CO<sub>2</sub>'

>>> html_formula('C123[13C]2H456N276O351S5')
'C<sub>123</sub>[13C]<sub>2</sub>H<sub>456</sub>N<sub>276</sub>O<sub>351</sub>S<sub>5</sub>'

要在Flask中使用,您可以定义模板过滤器:

@app.template_filter('html_formula')
def html_formula(value):
    comps = re.split('([A-Z][a-z]?|\[\d+[A-Z][a-z]?\])(\d+)', value)
    html = ''.join(['<sub>{}</sub>'.format(i) if i.isdigit() else i for i in comps])
    return html

然后在你的jinja模板中(记得使用safe来避免html转义):

{{mf | html_formula |安全}}