Python方程替换中的正则表达式

时间:2016-06-23 19:30:29

标签: python regex

我对正则表达式和Python有点新,我遇到以下情况。我想取一个方程式字符串,如"A + B + C + 4D",并将数字1放在所有前面没有数字的变量前面。如下所示:

>>> foo_eqn = "A + B + C + 4D"
>>> bar_eqn = fill_in_ones(foo_eqn)
>>> bar_eqn
"1A + 1B + 1C + 4D"

经过一番研究和询问,我想出了

def fill_in_ones(in_eqn):
    out_eqn = re.sub(r"(\b[A-Z]\b)", "1"+ r"\1", in_eqn, re.I)
    return(out_eqn)

但是,看起来这只适用于前两个变量:

>>> fill_in_ones("A + B")
1A + 1B
>>> fill_in_ones("A + B + E")
1A + 1B + E
>>> fill_in_ones("2A + B + C + D")
2A + 1B + 1C + D

我遗失的任何事情都很明显?谢谢!

1 个答案:

答案 0 :(得分:4)

看起来re.I(忽略案例标志)是罪魁祸首:

>>> def fill_in_ones(in_eqn):
...     out_eqn = re.sub(r"(\b[A-Z]\b)", "1"+ r"\1", in_eqn)
...     return(out_eqn)
...
>>>
>>> fill_in_ones("A + 3B + C + 2D + E")
'1A + 3B + 1C + 2D + 1E'

这是因为re.sub的下一个位置参数是count,而不是flags。你需要:

def fill_in_ones(in_eqn):
    out_eqn = re.sub(r"(\b[A-Z]\b)", "1"+ r"\1", in_eqn, flags=re.I)
    return(out_eqn)

不幸的是,re.I标志恰好是2

>>> import re
>>> re.I
2