如果要替换所有(非重叠)实例,则可以执行以下操作:
import re
re.sub(r'\$_([^$]*)\$', r'\1', w)
这将用< sub>(除$之外的所有东西)/ sub找到$_(除$之外的所有东西)的每个实例.
这意味着,如果您有类似Li $_3 $O $^ cat $的东西,它将被转换为Li 3-/ sub O $^ cat $.
如果然后还要将$^ … $转换为< sup> …< / sup> ;,则可以应用类似的策略.下面是填充变量结果的完整示例:
import re
w = ["Li$_3$O$^cat$", "Al$_2$O$_3$", "ZnO", "H$_2$O+O$^3$"]
w = str(w)
result = re.sub(r'\$_([^$]*)\$', r'\1', w)
result = re.sub(r'\$\^([^$]*)\$', r'\1', result)
print result
最终输出为:
['Li3Ocat', 'Al2O3', 'ZnO', 'H2O+O3']
就是说,如果需要完成的全部替换操作比这更复杂,那么您可能希望将替换规则存储在某种数据结构中.例如:
import re
def substitute(rules, input):
"""Return a string with substitution performed on given input
rules -- dict specifying the substitution rules
input -- input string to be substituted
"""
result = input
for k, v in rules.iteritems():
re_str = r'\$' + re.escape(k) + r'([^$]*)\$'
sub_str = r'\1%s>' % (v, v)
result = re.sub(re_str, sub_str, result)
return result
rules = {
'_': 'sub',
'^': 'sup'
}
w = ["Li$_3$O$^cat$", "Al$_2$O$_3$", "ZnO", "H$_2$O+O$^3$"]
print substitute(rules, str(w))
输出:
['Li3Ocat', 'Al2O3', 'ZnO', 'H2O+O3']
请注意,上述解决方案不处理嵌套替换.可以使用更高级的正则表达式功能(例如negative lookahead或full parsers)来处理这些(如果需要).