2014-01-16 79 views
1

我設法使用正則表達式將python函數拼湊在一起,將camel轉換爲蛇案例,它適用於所有測試用例,但我仍然有幾個問題。將駝峯案例轉換爲蛇案例的python函數

1)實際做的三個陳述各是什麼?

import re 

test_cases = list() 
test_cases.append('camelCase') 
test_cases.append('camelCaseCase') 
test_cases.append('camel2Case') 
test_cases.append('camel12Case') 
test_cases.append('camel12Case') 
test_cases.append('camelCaseURL') 
test_cases.append('camel2CaseURL') 
test_cases.append('camel12CaseURL') 
test_cases.append('camel12Case2URL') 
test_cases.append('camel12Case12URL') 
test_cases.append('CamelCase') 
test_cases.append('CamelCaseCase') 
test_cases.append('URLCamelCase') 


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


for string in test_cases: 
    print(string + ' -> ' + camel_to_snake(string)) 

導致:

camelCase -> camel_case 
camelCaseCase -> camel_case_case 
camel2Case -> camel_2_case 
camel12Case -> camel_12_case 
camel12Case -> camel_12_case 
camelCaseURL -> camel_case_url 
camel2CaseURL -> camel_2_case_url 
camel12CaseURL -> camel_12_case_url 
camel12Case2URL -> camel_12_case_2_url 
camel12Case12URL -> camel_12_case_12_url 
CamelCase -> camel_case 
CamelCaseCase -> camel_case_case 
URLCamelCase -> url_camel_case 
+0

總是有一種比正則表達式更簡單的方法,但我認爲你想問的問題是「有沒有更好的方法」,前提是你有一個「更好」的定義。這對於[代碼評論](http://codereview.stackexchange.com/) – wnnmaw

+2

是一個很好的問題你的意思是你實際上並不知道你寫的代碼在做什麼? –

+1

有關替代方法,請參見[這個着名的問題](http://stackoverflow.com/questions/1175208/elegant-python-function-to-convert-camelcase-to-camel-case)。 – DSM

回答

6

先回答你的第二個問題,這似乎是完成此任務的一個完全合理的方式,但它可能不會像其他的方法維護,因爲它可以很難弄清楚它是如何工作的。

下面是什麼每一行做了細分:

  • string = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', string)
    添加下劃線立即後跟一個或多個小寫字符每一個大寫字符之前,除了在字符串的開頭。

  • string = re.sub('(.)([0-9]+)', r'\1_\2', string)
    緊接在任何連續數字組之前加上一個下劃線,除了在字符串的開頭。

  • return re.sub('([a-z0-9])([A-Z])', r'\1_\2', string).lower()
    立即添加下劃線,有一個小寫字符或數字之前,任何大寫字符之前,整個字符串轉換爲小寫,並返回轉換。

相關問題