【问题标题】:CamelCase to Spaced Sentence Case regexCamelCase 到 Spaced Sentence Case 正则表达式
【发布时间】:2015-10-16 05:44:16
【问题描述】:

差不多了,但是我发现我的正则表达式有几个漏洞,可以将 CamelCase 转换为 Spaced Sentence Case。它在大多数情况下都很好(双关语),但它在第一个连字符上挂断了。我不知道为什么。

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()

【问题讨论】:

  • 你看到了什么?
  • 这是一种在单个正则表达式中完成所有操作的低效方法。不确定它是否符合所有标准(但似乎符合您分享的所有案例),我强烈建议不要使用它,哈哈:regex101.com/r/mB1lN8/1

标签: python regex camelcasing


【解决方案1】:

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

# 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 Something
  • @GhoulFool,我再次查看了结果,它们看起来不错。第一个 RE 的要求至少为 3 个字符,在这种情况下,最后一个必须是小写字母。 SR- 不适合这种情况。话虽如此,如果您不想将两个大写字母彼此相邻拆分,则 RE 可以更改为 regex = re.sub("([^-A-Z])([A-Z][a-z-]+)", r"\1 \2", u)
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 2011-09-13
  • 2011-09-28
相关资源
最近更新 更多