我有一个字符串:HotelCityClass
。我想在每个大写字母之间添加一个空格(除了第一个)。即Hotel City Class
。
我尝试过使用重新
re.sub(r' [A-Z]','',str_name)
但这只取代了每个大写字母。 re
是正确的,快速的方法吗?
答案 0 :(得分:3)
您可以使用前瞻性正则表达式:
import re
regex = re.compile(ur'(?!^)(?=[A-Z])', re.MULTILINE)
str = u"HotelCityClass"
result = re.sub(regex, " ", str)
<强>输出:强>
Hotel City Class
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)
我不会在这里使用任何预见,因为它们总是妨碍性能(尽管在这种情况下,影响太小)。
答案 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'