2011-09-06 45 views
7

我是新來的Python,我試圖取代一個字爲下劃線內的所有大寫,字母,例如:如何用下劃線替換大寫字母?

ThisIsAGoodExample 

應該成爲

this_is_a_good_example 

任何想法/提示/鏈接/如何實現這個教程?

+3

http://stackoverflow.com/questions/1175208/does-the-python-standard-library-have-function-to-convert-camelcase-to-camel-case –

+0

你給的例子不匹配標題也不匹配這個問題的描述。你是否試圖用下劃線替換所有大寫字符,或者你是否試圖將CamelCase轉換爲lowercase_underscore_separated?你會發現,除非你能夠用文字解釋你想要做什麼,否則用Python(或任何其他語言)解決它將會非常具有挑戰性。 – Johnsyweb

回答

0

解析你的字符串,每次遇到一個大寫字母時,在它前面插入一個_,然後切換髮現字符爲小寫

+0

(第一個除外) – rplnt

+0

第一個大寫字母呢? – Johnsyweb

+0

@rplnt - 因爲他的措辭不符合他的榜樣,我去空話 – KevinDTimm

8
import re 
"_".join(l.lower() for l in re.findall('[A-Z][^A-Z]*', 'ThisIsAGoodExample')) 

編輯: 其實,這只是作品,如果第一字母大寫。否則,這(從here拍攝)做正確的事:

def convert(name): 
    s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) 
    return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower() 
+0

別緊張上的新手。 :) –

2
example = 'ThisIsAGoodExample' 
# Don't put an underscore before first character. 
new_example = example[0] 
for character in example[1:]: 
    # Append an underscore if the character is uppercase. 
    if character.isupper(): 
     new_example += '_' 
    new_example += character.lower() 
+1

用'if character.isupper()'替換第6行,它也應該處理unicode。 –

+0

@Kirk,謝謝。固定。 –

10

這裏有一個正則表達式的方法:

import re 
example = "ThisIsAGoodExample" 
print re.sub('(?<!^)(?=[A-Z])', '_', example).lower() 

這是在說,「找點串在通過線的開始preceeded和跟着是一個大寫字符,並代之以一個下劃線。然後我們降低()的情況下,整個事情。

+2

錯過了大量的大寫字母。例如,它不會處理我的名字拼寫,例如「Éric」。 IIRC,'\ p {Lu}'是合適的模式,而不是'[A-Z]'。 – ikegami

1

由於沒有其他人提供了使用發電機的解決方案,這是一個:

>>> sample = "ThisIsAGoodExample" 
>>> def upperSplit(data): 
... buff = '' 
... for item in data: 
...  if item.isupper(): 
...  if buff: 
...   yield buff 
...   buff = '' 
...  buff += item 
... yield buff 
... 
>>> list(upperSplit(sample)) 
['This', 'Is', 'A', 'Good', 'Example'] 
>>> "_".join(upperSplit(sample)).lower() 
'this_is_a_good_example' 
4

這生成項目,其中每個項目是列表「_」後面的小寫字母,如果角色原本是大寫字母或字符本身(如果不是)。然後將它們串聯在一起成一個字符串,並刪除可能已被處理過程中添加任何前導下劃線:

print ''.join('_' + char.lower() if char.isupper() else char 
       for char in inputstring).lstrip('_') 

順便說一句,你還沒有指定如何處理已經存在的字符串中的下劃線做。我不知道如何處理這種情況,所以我踢了。

相關問題