Skip to content

Instantly share code, notes, and snippets.

@jaytaylor
Created September 6, 2012 21:41
Show Gist options
  • Star 38 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save jaytaylor/3660565 to your computer and use it in GitHub Desktop.
Save jaytaylor/3660565 to your computer and use it in GitHub Desktop.
Convert camel-case to snake-case in python.
#!/usr/bin/env python
"""
Convert camel-case to snake-case in python.
e.g.: CamelCase -> snake_case
Relevant StackOverflow question: http://stackoverflow.com/a/1176023/293064
"""
__author__ = 'Jay Taylor [@jtaylor]'
import re
_underscorer1 = re.compile(r'(.)([A-Z][a-z]+)')
_underscorer2 = re.compile('([a-z0-9])([A-Z])')
def camelToSnake(s):
"""
Is it ironic that this function is written in camel case, yet it
converts to snake case? hmm..
"""
subbed = _underscorer1.sub(r'\1_\2', s)
return _underscorer2.sub(r'\1_\2', subbed).lower()
if __name__ == '__main__':
assert camelToSnake('snakesOnAPlane') == 'snakes_on_a_plane'
assert camelToSnake('SnakesOnAPlane') == 'snakes_on_a_plane'
assert camelToSnake('snakes_on_a_plane') == 'snakes_on_a_plane'
assert camelToSnake('IPhoneHysteria') == 'i_phone_hysteria'
assert camelToSnake('iPhoneHysteria') == 'i_phone_hysteria'
print 'All tests passed.'
@farshid3003
Copy link

I tried lots of things which didn't support all cases and I made this one

def to_snake(camel_input):
        camel_input = camel_input.replace('&', '_and_')
        camel_input = re.sub(r'(?<!^)(?=[A-Z])', '_', camel_input).lower()
        words = re.findall(r'[A-Z]?[a-z]+|[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)|\d+', camel_input)
        return '_'.join(words)

result for "'my p&l AndP&L aa_BB_dd (teSt) AndMy P&L andAlsoP&L andAlso p&l A B aA'":

print(to_snake('my p&l AndP&L aa_BB_dd (teSt) AndMy P&L andAlsoP&L andAlso p&l A B aA'))
my_p_and_l_and_p_and_l_aa_b_b_dd_te_st_and_my_p_and_l_and_also_p_and_l_and_also_p_and_l_a_b_a_a

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment