2013-03-15 43 views
1

我試圖讓每一行的第一個字母大寫利用每一行的第一個字母使用regrex

我使用下面的正則表達式

ModCon = re.sub('^[a-z]{1}', lambda x: x.upper(), ModCon) 

沒有任何反應,當我運行程序...

+0

什麼是您的*輸入*呢?它是否包含換行符? – 2013-03-15 11:19:15

+0

@MartijnPieters是的,它確實..它是一個現在有2行的文件,我應該刪除所有雙空格來單行並在每行的開頭大寫每個字母 – 2013-03-15 11:21:10

+0

請注意'{1}'總是* *無用的構造。 「任何{1}」總是與「任何」相同。 – 2013-03-15 11:26:56

回答

2

^錨點只匹配輸入字符串的開頭。如果你希望它的每個換行符後匹配,你需要給它的re.Mre.MULTILINE標誌太:

ModCon = re.sub('^[a-z]', lambda x: x.group().upper(), ModCon, flags=re.M) 

我刪除了{1}部分;它是隱含的,沒有重複指示符,字符集只匹配一個字符。

替換函數通過Match object,所以您需要通過調用.group()方法來提取匹配的字符串。

+0

我收到一個錯誤,我認爲它與函數upper有關,我是以正確的方式呈現函數嗎? – 2013-03-15 11:29:11

+1

@HayaRaed:啊,不。一個匹配對象被傳入,而不是匹配的字符串。更新。 – 2013-03-15 11:31:49

+0

所以函數組(),它將匹配成一個字符串? – 2013-03-15 11:34:16

1

lambda函數中的變量x不是字符串類型,但是它是<類型'_sre.SRE_Match'>。爲了得到匹配的字符串,你需要call x.group()

因此(也使用在其他的答案中的提示),下面的腳本正常工作:

import re 
ModCon= "what is your favorite color?\nred" 
ModCon = re.sub('^[a-z]', lambda x: x.group().upper(), ModCon, flags=re.M) 
print (ModCon) 
相關問題