我是新來的Python,我試圖取代一個字爲下劃線內的所有大寫,字母,例如:如何用下劃線替換大寫字母?
ThisIsAGoodExample
應該成爲
this_is_a_good_example
任何想法/提示/鏈接/如何實現這個教程?
我是新來的Python,我試圖取代一個字爲下劃線內的所有大寫,字母,例如:如何用下劃線替換大寫字母?
ThisIsAGoodExample
應該成爲
this_is_a_good_example
任何想法/提示/鏈接/如何實現這個教程?
解析你的字符串,每次遇到一個大寫字母時,在它前面插入一個_,然後切換髮現字符爲小寫
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()
別緊張上的新手。 :) –
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()
用'if character.isupper()'替換第6行,它也應該處理unicode。 –
@Kirk,謝謝。固定。 –
這裏有一個正則表達式的方法:
import re
example = "ThisIsAGoodExample"
print re.sub('(?<!^)(?=[A-Z])', '_', example).lower()
這是在說,「找點串在不通過線的開始preceeded和是跟着是一個大寫字符,並代之以一個下劃線。然後我們降低()的情況下,整個事情。
錯過了大量的大寫字母。例如,它不會處理我的名字拼寫,例如「Éric」。 IIRC,'\ p {Lu}'是合適的模式,而不是'[A-Z]'。 – ikegami
由於沒有其他人提供了使用發電機的解決方案,這是一個:
>>> 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'
這生成項目,其中每個項目是列表「_」後面的小寫字母,如果角色原本是大寫字母或字符本身(如果不是)。然後將它們串聯在一起成一個字符串,並刪除可能已被處理過程中添加任何前導下劃線:
print ''.join('_' + char.lower() if char.isupper() else char
for char in inputstring).lstrip('_')
順便說一句,你還沒有指定如何處理已經存在的字符串中的下劃線做。我不知道如何處理這種情況,所以我踢了。
http://stackoverflow.com/questions/1175208/does-the-python-standard-library-have-function-to-convert-camelcase-to-camel-case –
你給的例子不匹配標題也不匹配這個問題的描述。你是否試圖用下劃線替換所有大寫字符,或者你是否試圖將CamelCase轉換爲lowercase_underscore_separated?你會發現,除非你能夠用文字解釋你想要做什麼,否則用Python(或任何其他語言)解決它將會非常具有挑戰性。 – Johnsyweb