我想要实现的是这样的效果:
>>> 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和hippolyte的解决方案会吃掉一个空格,从而违反了“分割不应更改各个部分”的想法。在其余两个选择中唯一的区别是我的解决方案在空字符串输入时返回一个带有空字符串的列表,而@200_success的解决方案返回一个空列表。我不知道Python社区对这个问题的立场,所以我说:我对任何一种都没有意见。由于@200_success的解决方案更简单,所以我接受了它作为正确答案。
ABC
驼峰式命名法?! - mihai"ABCCamelCase"
上的执行情况,那么它的结果是符合预期的:['ABC','Camel','Case']
。如果你将ABC
解释为 AbstractBaseClass 的缩写,那么我很抱歉造成了混淆,因为在我的问题中,ABC
只是三个任意的大写字母。 - AplusKminusstr.split(' ')
将其拆分成(更通用的)各个部分的列表。 - AplusKminus['some','HTML','File']
的普遍愿望。 - AplusKminus