Rei*_*ica 333 python camelcasing
例:
>>> convert('CamelCase')
'camel_case'
Run Code Online (Sandbox Code Playgroud)
小智 734
这非常彻底:
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()
Run Code Online (Sandbox Code Playgroud)
适用于所有这些(并且不会损害已经未出版的版本):
>>> convert('CamelCase')
'camel_case'
>>> convert('CamelCamelCase')
'camel_camel_case'
>>> convert('Camel2Camel2Case')
'camel2_camel2_case'
>>> convert('getHTTPResponseCode')
'get_http_response_code'
>>> convert('get2HTTPResponseCode')
'get2_http_response_code'
>>> convert('HTTPResponseCode')
'http_response_code'
>>> convert('HTTPResponseCodeXYZ')
'http_response_code_xyz'
Run Code Online (Sandbox Code Playgroud)
或者,如果你打算多次调用它,你可以预编译正则表达式:
first_cap_re = re.compile('(.)([A-Z][a-z]+)')
all_cap_re = re.compile('([a-z0-9])([A-Z])')
def convert(name):
s1 = first_cap_re.sub(r'\1_\2', name)
return all_cap_re.sub(r'\1_\2', s1).lower()
Run Code Online (Sandbox Code Playgroud)
不要忘记导入正则表达式模块
import re
Run Code Online (Sandbox Code Playgroud)
Bra*_*och 166
包索引中有一个变形库,可以为您处理这些事情.在这种情况下,您将寻找inflection.underscore():
>>> inflection.underscore('CamelCase')
'camel_case'
Run Code Online (Sandbox Code Playgroud)
nic*_*kl- 93
我不知道为什么这些都如此复杂.
对于大多数情况,简单的表达式([A-Z]+)将起到作用
>>> re.sub('([A-Z]+)', r'_\1','CamelCase').lower()
'_camel_case'
>>> re.sub('([A-Z]+)', r'_\1','camelCase').lower()
'camel_case'
>>> re.sub('([A-Z]+)', r'_\1','camel2Case2').lower()
'camel2_case2'
>>> re.sub('([A-Z]+)', r'_\1','camelCamelCase').lower()
'camel_camel_case'
>>> re.sub('([A-Z]+)', r'_\1','getHTTPResponseCode').lower()
'get_httpresponse_code'
Run Code Online (Sandbox Code Playgroud)
忽略第一个charachter只需添加后面的外观 (?!^)
>>> re.sub('(?!^)([A-Z]+)', r'_\1','CamelCase').lower()
'camel_case'
>>> re.sub('(?!^)([A-Z]+)', r'_\1','CamelCamelCase').lower()
'camel_camel_case'
>>> re.sub('(?!^)([A-Z]+)', r'_\1','Camel2Camel2Case').lower()
'camel2_camel2_case'
>>> re.sub('(?!^)([A-Z]+)', r'_\1','getHTTPResponseCode').lower()
'get_httpresponse_code'
Run Code Online (Sandbox Code Playgroud)
如果你想将ALLCaps分离到all_caps并期望你的字符串中的数字,你仍然不需要做两个单独的运行只需使用|这个表达式((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))几乎可以处理书中的每个场景
>>> a = re.compile('((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))')
>>> a.sub(r'_\1', 'getHTTPResponseCode').lower()
'get_http_response_code'
>>> a.sub(r'_\1', 'get2HTTPResponseCode').lower()
'get2_http_response_code'
>>> a.sub(r'_\1', 'get2HTTPResponse123Code').lower()
'get2_http_response123_code'
>>> a.sub(r'_\1', 'HTTPResponseCode').lower()
'http_response_code'
>>> a.sub(r'_\1', 'HTTPResponseCodeXYZ').lower()
'http_response_code_xyz'
Run Code Online (Sandbox Code Playgroud)
这一切都取决于你想要什么,所以使用最适合你需求的解决方案,因为它不应该过于复杂.
的nJoy!
oto*_*can 29
避免库和正则表达式:
def camel_to_snake(s):
return ''.join(['_'+c.lower() if c.isupper() else c for c in s]).lstrip('_')
Run Code Online (Sandbox Code Playgroud)
>>> camel_to_snake('ThisIsMyString')
'this_is_my_string'
Run Code Online (Sandbox Code Playgroud)
Teh*_*ris 13
就个人而言,我不确定在python中使用正则表达式的任何东西都可以被描述为优雅.这里的大多数答案只是做"代码高尔夫"类型的RE技巧.优雅的编码应该很容易理解.
def to_snake_case(not_snake_case):
final = ''
for i in xrange(len(not_snake_case)):
item = not_snake_case[i]
if i < len(not_snake_case) - 1:
next_char_will_be_underscored = (
not_snake_case[i+1] == "_" or
not_snake_case[i+1] == " " or
not_snake_case[i+1].isupper()
)
if (item == " " or item == "_") and next_char_will_be_underscored:
continue
elif (item == " " or item == "_"):
final += "_"
elif item.isupper():
final += "_"+item.lower()
else:
final += item
if final[0] == "_":
final = final[1:]
return final
>>> to_snake_case("RegularExpressionsAreFunky")
'regular_expressions_are_funky'
>>> to_snake_case("RegularExpressionsAre Funky")
'regular_expressions_are_funky'
>>> to_snake_case("RegularExpressionsAre_Funky")
'regular_expressions_are_funky'
Run Code Online (Sandbox Code Playgroud)
Bea*_*eau 12
stringcase是我的首选库; 例如:
>>> from stringcase import pascalcase, snakecase
>>> snakecase('FooBarBaz')
'foo_bar_baz'
>>> pascalcase('foo_bar_baz')
'FooBarBaz'
Run Code Online (Sandbox Code Playgroud)
''.join('_'+c.lower() if c.isupper() else c for c in "DeathToCamelCase").strip('_')
re.sub("(.)([A-Z])", r'\1_\2', 'DeathToCamelCase').lower()
Run Code Online (Sandbox Code Playgroud)
我认为此解决方案比以前的答案更直接:
import re
def convert (camel_input):
words = re.findall(r'[A-Z]?[a-z]+|[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)|\d+', camel_input)
return '_'.join(map(str.lower, words))
# Let's test it
test_strings = [
'CamelCase',
'camelCamelCase',
'Camel2Camel2Case',
'getHTTPResponseCode',
'get200HTTPResponseCode',
'getHTTP200ResponseCode',
'HTTPResponseCode',
'ResponseHTTP',
'ResponseHTTP2',
'Fun?!awesome',
'Fun?!Awesome',
'10CoolDudes',
'20coolDudes'
]
for test_string in test_strings:
print(convert(test_string))
Run Code Online (Sandbox Code Playgroud)
哪个输出:
camel_case
camel_camel_case
camel_2_camel_2_case
get_http_response_code
get_200_http_response_code
get_http_200_response_code
http_response_code
response_http
response_http_2
fun_awesome
fun_awesome
10_cool_dudes
20_cool_dudes
Run Code Online (Sandbox Code Playgroud)
正则表达式匹配三种模式:
[A-Z]?[a-z]+:连续的小写字母,可以选择以大写字母开头。[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$):两个或多个连续的大写字母。如果在前一个大写字母后跟一个小写字母,它将使用前瞻性排除。\d+:连续数字。通过使用,re.findall我们获得了单个“单词”的列表,这些单词可以转换为小写并带有下划线。
小智 5
我不明白为什么同时使用.sub()调用?:)我不是正则表达式大师,但我简化了这个功能,这适合我的特定需求,我只需要一个解决方案将camelCasedVars从POST请求转换为vars_with_underscore:
def myFunc(...):
return re.sub('(.)([A-Z]{1})', r'\1_\2', "iTriedToWriteNicely").lower()
Run Code Online (Sandbox Code Playgroud)
它不适用于像getHTTPResponse这样的名称,因为我听说它是错误的命名约定(应该像getHttpResponse,显然,它更容易记住这个表单).