2015-10-15 45 views
1

幾乎在那裏,但我發現了一些與我的正則表達式的漏洞,將CamelCase變成Spaces Sentence Case。它在大多數情況下都表現良好(雙關語),但它被掛在第一個帶連字符的單詞上。我無法弄清楚爲什麼。CamelCase到Spaced Sentence案例正則表達式

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

+0

你怎麼看呢? –

+0

這是一個令人厭惡的低效率的方法,在單個正則表達式中完成所有工作。不確定它是否符合所有標準(但看起來與您分享的所有案例相符),我強烈建議不要使用這個,哈哈:https://regex101.com/r/mB1lN8/1 – lintmouse

回答

2

的原因這種類型的處理可能會非常棘手。我認爲你所看到的問題是在你第一次添加空格時的第一步。除了在分割之前添加空格,而不是在分割之前添加連字符之外,還可以應用。

# 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! 
+0

感謝您的幫助@leroyJr,問題**比看起來好得多。您可能需要仔細檢查,但我有一種感覺,第三行出現爲S R-128 Something Something –

+0

@GhoulFool,我再次檢查了結果,他們看起來很好。對於第一個RE的要求至少爲3個字符,在這種情況下,最後一個必須是小寫字母。 SR-不適合這種情況。話雖如此,如果您不想將兩個大寫字母α彼此相鄰,那麼RE可以更改爲'regex = re.sub(「([^ - AZ])([AZ] [az - ] +)」), r「\ 1 \ 2」,u)'。 – leroyJr