【发布时间】:2013-08-10 17:59:42
【问题描述】:
我正在尝试解析以 unicode 格式提供给我的化学式,格式为 C7H19N3
我希望隔离字母后第一个数字的位置,即7 位于索引 1,1 位于索引 3。这样我想在数字前面插入“sub”
我的前几次尝试让我循环尝试仅隔离第一个数字的位置,但无济于事。
我认为正则表达式可以做到这一点,虽然我很迷茫。
我的最终目标是输出公式Csub7Hsub19Nsub3,以便我的文本编辑器可以正确格式化它。
【问题讨论】:
我正在尝试解析以 unicode 格式提供给我的化学式,格式为 C7H19N3
我希望隔离字母后第一个数字的位置,即7 位于索引 1,1 位于索引 3。这样我想在数字前面插入“sub”
我的前几次尝试让我循环尝试仅隔离第一个数字的位置,但无济于事。
我认为正则表达式可以做到这一点,虽然我很迷茫。
我的最终目标是输出公式Csub7Hsub19Nsub3,以便我的文本编辑器可以正确格式化它。
【问题讨论】:
这个怎么样?
>>> re.sub('(\d+)', 'sub\g<1>', "C7H19N3")
'Csub7Hsub19Nsub3'
(\d+) 是匹配 1 个或多个数字的 capturing group。 \g<1> 是在替换字符串中引用已保存组的一种方式。
【讨论】:
re.sub(r'(?<!\d)(?=\d)', 'sub', "C7H19N3")
类似这样的前瞻和后瞻:
>>> strs = 'C7H19N3'
>>> re.sub(r'(?<!\d)(?=\d)','sub',strs)
'Csub7Hsub19Nsub3'
这匹配字符串中的以下位置:
C^7H^19N^3 # ^ represents the positions matched by the regex.
【讨论】:
这是一个字面上匹配字母后的第一个数字:
>>> re.sub(r'([A-Z])(\d)', r'\1sub\2', "C7H19N3")
'Csub7Hsub19Nsub3'
它在功能上是等效的,但可能更能表达意图? \1 是 \g<1> 的较短版本,我还使用了原始字符串文字(r'\1sub\2' 而不是 '\1sub\2')。
【讨论】: