2016-06-23 70 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