【问题标题】:python function to convert camel case to snake case [duplicate]python函数将骆驼案例转换为蛇案例[重复]
【发布时间】:2014-01-16 18:21:00
【问题描述】:

我设法使用正则表达式拼凑了一个 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

【问题讨论】:

  • 总有比正则表达式更简单的方法,但我认为您想问的问题是“有没有更好的方法”,前提是您有“更好”的定义。这对code review来说是个好问题@
  • 你的意思是你实际上并不知道你写的代码在做什么?
  • 有关替代方法,请参阅this famous question
  • @DSM:实际上,我会说这是那个副本的副本。
  • @MartijnPieters,是的,我实际上并不知道我写的代码在做什么。我只是把它弄乱了,直到我让它工作。这就是为什么我试图了解它实际上在做什么。这不是您引用 b/c 的问题的欺骗,我希望单词之间的数字用下划线分隔。不过,我从您引用的问题中提取了大量代码。

标签: python regex


【解决方案1】:

首先回答您的第二个问题,这似乎是完成此任务的一种完全合理的方式,但它可能不像其他方法那样可维护,因为它可能有点难以弄清楚它是如何工作的。

以下是每行的功能细分:

  • 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()
    在任何前面有小写字符或数字的大写字符之前添加一个下划线,并将整个字符串转换为小写并返回。

【讨论】:

    猜你喜欢
    • 2022-06-11
    • 1970-01-01
    • 2019-10-30
    • 2020-02-10
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2019-05-15
    • 2016-01-16
    相关资源
    最近更新 更多