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

ショート先端\ 1 "。 – mbomb007

答えて

4

re.Iように見える(ケースフラグを無視する)原因である:re.subの横位置引数がcount、ないflagsあるため

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

です。あなたは必要があります

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であることを起こる:代わりに ` "1" + R」の` R "1 \ 1" `使用し、

>>> import re 
>>> re.I 
2 
+1

[構文](https://docs.python.org/2/library/re.html): 're.sub(パターン、repl、文字列、カウント= 0、フラグ= 0)'そして、それは 're.I == 2'だからです。 – mbomb007

+0

大変ありがとうございます! – MAB