当前位置: 首页 > 面试题库 >

如何在Python中分割CamelCase

卫和洽
2023-03-14
问题内容

我想要达到的目标是这样的:

>>> camel_case_split("CamelCaseXYZ")
['Camel', 'Case', 'XYZ']
>>> camel_case_split("XYZCamelCase")
['XYZ', 'Camel', 'Case']

所以我搜索并找到了这个完美的正则表达式

(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])

作为下一个逻辑步骤,我尝试了:

>>> re.split("(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])", "CamelCaseXYZ")
['CamelCaseXYZ']

为什么这不起作用,如何从python中的链接问题中获得结果?

编辑:解决方案摘要

我用一些测试用例测试了所有提供的解决方案:

string:                 ''
AplusKminus:            ['']
casimir_et_hippolyte:   []
two_hundred_success:    []
kalefranz:              string index out of range # with modification: either [] or ['']

string:                 ' '
AplusKminus:            [' ']
casimir_et_hippolyte:   []
two_hundred_success:    [' ']
kalefranz:              [' ']

string:                 'lower'
all algorithms:         ['lower']

string:                 'UPPER'
all algorithms:         ['UPPER']

string:                 'Initial'
all algorithms:         ['Initial']

string:                 'dromedaryCase'
AplusKminus:            ['dromedary', 'Case']
casimir_et_hippolyte:   ['dromedary', 'Case']
two_hundred_success:    ['dromedary', 'Case']
kalefranz:              ['Dromedary', 'Case'] # with modification: ['dromedary', 'Case']

string:                 'CamelCase'
all algorithms:         ['Camel', 'Case']

string:                 'ABCWordDEF'
AplusKminus:            ['ABC', 'Word', 'DEF']
casimir_et_hippolyte:   ['ABC', 'Word', 'DEF']
two_hundred_success:    ['ABC', 'Word', 'DEF']
kalefranz:              ['ABCWord', 'DEF']

总而言之,您可以说@kalefranz的解决方案与问题不符(请参阅最后一种情况),而@casimir et
hippolyte的解决方案占用了一个空格,因此违反了拆分不应更改各个部分的想法。其余两个替代方案之间的唯一区别是,我的解决方案返回一个在空字符串输入中包含空字符串的列表,而@
200_success的解决方案返回一个空列表。我不知道python社区在这个问题上的立场,所以我说:我对任何一个都很好。而且由于200_success的解决方案更简单,所以我接受了它作为正确的答案。


问题答案:

正如@AplusKminus解释的那样,re.split()切勿在空模式匹配上拆分。因此,您应该尝试查找感兴趣的组件,而不是拆分。

Here is a solution using re.finditer() that emulates splitting:

def camel_case_split(identifier):
    matches = finditer('.+?(?:(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|$)', identifier)
    return [m.group(0) for m in matches]


 类似资料:
  • 问题内容: 这是解释此问题的最简单方法。这是我正在使用的: 这就是我想要的: 原因是我想将字符串拆分为标记,对其进行操作,然后再次将其放回原处。 问题答案:

  • 问题内容: let string = “hello hi” var hello = “” var hi = “” 我不会分割字符串,以便hello的值获得“ hello”,hi的值获得“ hi” 问题答案: 试试这个: 字符串的名称在哪里,并且包含由空格分隔的组件。 然后,您可以将组件获取为: Doc:componentsSeparatedByString 编辑: 对于Swift 3,以上将是:

  • 问题内容: 我有以下输入: 预期产量: 如何分割字符串以产生所需的输出? 问题答案:

  • 问题内容: 我有一个巨大的文本文件(〜1GB),可惜我使用的文本编辑器无法读取这么大的文件。但是,如果我可以将其分为两部分或三部分,那就没问题了,因此,作为练习,我想用python编写一个程序来做到这一点。 我想让程序执行的操作是找到文件的大小,将该数字分成多个部分,然后对于每个部分,逐块读取至该点,写入 文件名.nnn输出文件,然后读取- 到下一个换行符并将其写入,然后关闭输出文件,等等。显然,

  • 接手一个软件工程并把它分为可以由个人实现的任务是很有趣的。这事应该及早进行。有时候经理可能会认为不考虑个人的项目能够起作用。这是不可能的,因为每个人的生产力是如此广泛地不同。对某个组件有特殊知识的人也经常改变,并且可以对工作效果有一个数量级的影响。 正如一个作曲家认为乐器的音色会其重要作用,或者运动队教练对每个运动员的体能的考虑那样,有经验的团队领导,通常不能够把工程依据团队成员需要承担的角色那样

  • 我正在尝试实现一个涉及几何级数(拆分)的计算。有什么有效的方法吗。数据集有数百万行。我需要“交易数量”栏 turtle=2(用户定义) base_quantity=1(用户自定义) 对于第0行,Traded_quantity应该为零(因为标记为零) 对于第一行,Traded_quantity应该是(1x1)(1x2)=3(标记2将被分成1和1,第一个1将与base_quantity相乘 对于第二行