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