1. ホーム
  2. パイソン

[解決済み】CamelCaseをsnake_caseに変換するPythonのエレガントな関数?

2022-03-26 13:38:14

質問

>>> convert('CamelCase')
'camel_case'

解決方法は?

ラクダのケースからヘビのケースへ

import re

name = 'CamelCaseName'
name = re.sub(r'(?<!^)(?=[A-Z])', '_', name).lower()
print(name)  # camel_case_name

何度もやっていて上記が遅い場合は、あらかじめ正規表現をコンパイルしておくとよいでしょう。

pattern = re.compile(r'(?<!^)(?=[A-Z])')
name = pattern.sub('_', name).lower()

より高度なケースを特別に処理するため(これはもう可逆的ではありません)。

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

print(camel_to_snake('camel2_camel2_case'))  # camel2_camel2_case
print(camel_to_snake('getHTTPResponseCode'))  # get_http_response_code
print(camel_to_snake('HTTPResponseCodeXYZ'))  # http_response_code_xyz

アンダースコアが2つ以上ある場合も追加する。

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

スネークケースからキャメルケースへ

name = 'snake_case_name'
name = ''.join(word.title() for word in name.split('_'))
print(name)  # SnakeCaseName