2016-06-23 36 views
2

我对于正则表达式和Python有点新奇,并且处于以下情况。我想采用一个等式字符串,如"A + B + C + 4D",并将数字1放在所有没有数字的变量前面。因此,像:Python中的正则表达式公式替换

>>> 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 

什么真的很明显我失踪了?谢谢!

+2

短尖,使用'R “1 \ 1”',而不是' “1” + R“\ 1" '。 – mbomb007

回答

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 
+1

[语法](https://docs.python.org/2/library/re.html):'re.sub(pattern,repl,string,count = 0,flags = 0)'。这是因为're.I == 2' – mbomb007

+0

太棒了,非常感谢! – MAB