Python CamelCase到间隔句大小写正则表达式

Python CamelCase到间隔句大小写正则表达式,python,regex,camelcasing,Python,Regex,Camelcasing,差不多了,但我发现我的正则表达式有几个漏洞,可以把CamelCase转换成间隔句子。它在大多数情况下都很好(双关语的意思),但是在第一个连字符的单词上它就被挂断了。我不明白为什么 import re # --------------------------------------------------------- def camelCaseToSpacedTitleCase(u): # add spaces regex = re.sub("(.)([A-Z][a-z-]+)", r

差不多了,但我发现我的正则表达式有几个漏洞,可以把CamelCase转换成间隔句子。它在大多数情况下都很好(双关语的意思),但是在第一个连字符的单词上它就被挂断了。我不明白为什么

import re

# ---------------------------------------------------------
def camelCaseToSpacedTitleCase(u):
  # add spaces
  regex = re.sub("(.)([A-Z][a-z-]+)", r"\1 \2", u)

  # make title case
  regex = re.sub("([a-z0-9])([A-Z])", r"\1 \2", regex)

  # keep CAPITALISED words
  regex = re.sub("(^|\s)(\S)", r"\1" + r"\2".upper(), regex)

  # keep Mc and Mac
  regex = re.sub("(Mc|Mac)(\s)", r"\1", regex)

  # keep digits
  regex = re.sub("([a-z]+)([0-9]+\s)", r"\1 \2", regex)

  # keep I or A
  regex = re.sub("(\sA|\sI)([A-Z])([a-z]*)", r"\1 \2\3", regex)

  # remove double whitespaces
  regex = re.sub("\s{2,32}", r" ", regex)

  return regex


test1 = "TheAmazingSpider-Man"
test2 = "WeAreSexBob-Omb"
test3 = "SR-128  SomethingSomething"
test4 = "Ex-Voto - Monitor"
test5 = "FergusMcNeilEyeContact"
test6 = "It'sABanana"
test7 = "HouseOf1000Zombies!"

print (camelCaseToSpacedTitleCase(test1))
print (camelCaseToSpacedTitleCase(test2))
print (camelCaseToSpacedTitleCase(test3))
print (camelCaseToSpacedTitleCase(test4))
print (camelCaseToSpacedTitleCase(test5))
print (camelCaseToSpacedTitleCase(test6))
print (camelCaseToSpacedTitleCase(test7))
我希望看到

"The Amazing Spider-Man" 
"We Are Sex Bob-Omb"
"SR-128 Something Something"
"Ex-Voto - Monitor"
"Fergus McNeil Eye Contact"
"It's A Banana"
"House Of 1000 Zombies!"

出于上述原因,我希望避免使用.titlecase()

这种类型的处理可能很棘手。我认为你看到的问题是在你第一次添加空格的第一步。仅当拆分前没有连字符时才应用,而不是向任何大小写拆分添加空格

# Replace: regex = re.sub("(.)([A-Z][a-z-]+)", r"\1 \2", u)
regex = re.sub("([^-])([A-Z][a-z-]+)", r"\1 \2", u)
给出了以下结果

# The Amazing Spider-Man
# We Are Sex Bob-Omb
# SR-128 Something Something
# Ex-Voto - Monitor
# Fergus McNeil Eye Contact
# It's A Banana
# House Of 1000 Zombies!

相反,你看到了什么?这是一种在一个正则表达式中完成所有操作的效率极低的方法。不确定它是否符合所有标准(但似乎符合您共享的所有案例),我强烈建议不要使用它,哈哈:谢谢您的帮助@leroyJr,这个问题比看起来要棘手得多。你可能需要仔细检查一下,但我感觉第三行是S R-128什么的Something@GhoulFool,我再次检查了结果,结果看起来不错。第一个RE的要求至少为3个字符,在这种情况下,最后一个必须是小写字母。SR-不适合那种情况。话虽如此,如果您不想拆分相邻的两个大写字母,RE可以更改为
regex=RE.sub(([^-A-Z])([A-Z][A-Z-]+),r“\1\2”,u)