2011-03-15 15 views
0

我有一個字符串,我需要編輯,它看​​起來類似於這樣:Python的RE的問題 - 正確的狀態初始格式

string = "Idaho Ave N,,Crystal,Mn,55427-1463,US,,610839124763,Expedited" 

如果您發現該州最初的「錳」是不是在正確的格式。我試圖使用正則表達式可以改變:

re.sub("[A-Z][a-z],", "[A-Z][A-Z],", string) 

然而,應用re.sub把第二部分作爲文字和將改變的Mn,以[A-Z] [A-Z] ,.我該如何使用re.sub(或類似的和簡單的)來正確地將Mn轉換爲MN中的字符串?

預先感謝您!

回答

0

您可以通過一個函數作爲替代參數re.sub產生從匹配對象的替換字符串,如:

import re 

s = "Idaho Ave N,,Crystal,Mn,55427-1463,US,,610839124763,Expedited" 

def upcase(match): 
    return match.group().upper() 

print re.sub("[A-Z][a-z],", upcase, s) 

(這是忽略你是否真的用這種方法找到狀態首字母的問題。)

re.sub的相應文檔是here

+0

這與我想到的非常相似,謝謝大家,謝謝大家的迴應。 – user660853 2011-03-15 16:09:44

2

您的re.sub可能會修改您不想修改的部分字符串。儘量明確處理權元素列表:

input = "Idaho Ave N,,Crystal,Mn,55427-1463,US,,610839124763,Expedited" 
elems = input.split(',') 
elems[3] = elems[3].upper() 
output = ','.join(elems) 

回報

'Idaho Ave N,,Crystal,MN,55427-1463,US,,610839124763,Expedited' 
-1

您可以通過它周圍括號withing你的正則表達式創建一個組,然後參考是由它的羣號:

re.sub("([A-Z][a-z]),", "\1,".upper(), string) 
+0

在替換開始之前調用'upper()'不是有效的。 – 2011-03-15 15:32:08

0
sub(pattern, repl, string, count=0) 

返回通過更換最左邊 非重疊得到的線由 替代repl字符串中的模式發生。 repl可以是字符串也可以是可調用的; 如果處理了一個字符串,反斜槓轉義。如果它是可調用的 ,則它傳遞匹配對象,並且必須返回 要使用的替換字符串。

re.sub("[A-Z][a-z]", lambda m: m.group(0).upper(), myString) 

我會避免調用您的變量string,因爲這是一個類型的名字。