通过在每个大写字母前添加一个空格来格式化字符串

时间:2015-09-22 09:42:23

标签: python regex

我有一个字符串:HotelCityClass。我想在每个大写字母之间添加一个空格(除了第一个)。即Hotel City Class

我尝试过使用重新

  

re.sub(r' [A-Z]','',str_name)

但这只取代了每个大写字母。 re是正确的,快速的方法吗?

5 个答案:

答案 0 :(得分:3)

您可以使用前瞻性正则表达式:

import re
regex = re.compile(ur'(?!^)(?=[A-Z])', re.MULTILINE)
str = u"HotelCityClass"

result = re.sub(regex, " ", str)

<强>输出:

Hotel City Class

RegEx Demo

RegEx分手:

(?!^)      # negative lookahead to assert that we are not at start
(?=[A-Z])  # positive lookahead to assert that next position is an uppercase letter

如果超过断言,则替换只是空格。

答案 1 :(得分:3)

另一个通过非单词边界\B,在两个单词字符和两个非单词字符之间进行匹配。

>>> s = 'HotelCityClass'
>>> re.sub(r'\B([A-Z])', r' \1', s)
'Hotel City Class'
>>> re.sub(r'\B(?=[A-Z])', r' ', s)
'Hotel City Class'

答案 2 :(得分:2)

如果您必须处理CaMeL单词,可以使用以下正则表达式:

([a-z])([A-Z])

它捕获一个小写字母和下面的大写字母,然后在替换中,我们可以添加对捕获的组的反向引用(\1\2)。

import re
p = re.compile(r'([a-z])([A-Z])')
test_str = "HotelCityClass"
result = re.sub(p, r"\1 \2", test_str)
print(result)

请参阅IDEONE demo

请注意,如果您只想在任何不带空格的大写单词之前插入空格,请使用

p = re.compile(r'(\S)([A-Z])')
result = re.sub(p, r"\1 \2", test_str)

请参阅another IDEONE demo

我不会在这里使用任何预见,因为它们总是妨碍性能(尽管在这种情况下,影响太小)。

答案 3 :(得分:1)

这是一个明确的方法:

import re
a = 'HotelCityClass'
b = re.findall('[A-Z][a-z]*', a)

c = ' '.join(b)

print(c)

答案 4 :(得分:0)

这应该做你的工作

re.sub(r"(\w)([A-Z])", r"\1 \2", "HotelCityClass")
>>> 'Hotel City Class'