2016-11-10 42 views
0

我有很多的字符串中的蟒蛇應用re.sub單個或多個字符

100XX123XX1XX234XXXXX形式,我想全部更換爲X0的。地址形式中的字符串中還有其他文本。

234XX N. Somestreet Anytown, USA如果數字後面X不會出現在其他地方,所以我不能只是代替我不能確定的X的

我有這樣的代碼,但迄今爲止它只是在一個單一的0和我下探需要它在0的可變數量的下降..

re.sub(r"([0-9]+)([X]+)", r"\g<1>0", "234XX")

,這將給我2340 ...我需要它返回23400或者如果給123XXX我需要它返回123000

+0

您可以使用lambda功能置換。用這種方法你可以計算你有多少個零。 –

回答

2

您可以使用一個回調函數來得到你想要的結果,看到http://ideone.com/ccB37k

import re 

def repl(m): 
    return (m.group(1) + m.group(2).replace('X','0')) 

str = '234XX N. Somestreet Anytown, USA' 
pattern = r'\b(\d+)(X+)\b' 
print(re.sub(pattern, repl, str)) 
1

我會做的是使用finditer來回報您的正則表達式的MatchObjects,您就可以訪問的功能,如start()end()到重建你的字符串。由於這是一個直接替換,你可以做到這一點,而不必擔心索引問題。

import re 

res = '234XX N. Somestreet Anytown, USA\n234XXXXXX N. Somestreet Anytown, USA\nXXXXXXXXXX' 

for match in re.finditer(r"([0-9]+)([X]+)", res): 
    print(match.group(1)) 
    print(len(match.group(2))) 
    # res = res[:match.end(1)] + ('0' * len(match.group(2))) + res[match.end():] 
    res = res[:match.end(1)] + match.group(2).replace('X','0') + res[match.end():] 

print(res) 
0

我落得這樣做使得可贖回和傳球,爲re.sub

def sub_0_for_x(match): 
    old = match.groups() 
    return old[0] + "0" * len(match[1]) 

re.sub("([0-9]+)([0]+)", sub_0_for_x, "123XX Anyplace, USA")