【发布时间】:2015-07-07 02:32:19
【问题描述】:
我想要达到的目标是这样的:
>>> camel_case_split("CamelCaseXYZ")
['Camel', 'Case', 'XYZ']
>>> camel_case_split("XYZCamelCase")
['XYZ', 'Camel', 'Case']
于是我搜索并找到了这个perfect regular expression:
(?<=[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 的解决方案比较简单,所以我接受了它作为正确答案。
【问题讨论】:
-
怎么样
ABCCamelCase?! -
@Mihai 我不明白你的问题。如果您想知道正则表达式在
"ABCCamelCase"上的表现如何,它会按预期工作:['ABC', 'Camel', 'Case']。如果您将ABC解释为代表AbstractBaseClass,那么我很抱歉造成混淆,因为ABC在我的问题中只是三个任意大写字母。 -
也是一个很好的答案,但我没有找到问题,因为措辞对于我的搜索来说太具体了。此外,您的回答并不能完全满足这里的要求,因为它会生成一个带有任意分隔符的转换字符串,您需要使用
str.split(' ')进行拆分,而不是其部分的(更通用的)列表。
标签: python regex camelcasing