如何用Python中的单个下划线替换所有连续的大写字母

时间:2013-07-25 01:36:41

标签: python regex

例如

" JHDKFksdKSJDsGGGG"成为" _ksd_s _"

有没有办法用单个下划线替换大写集群?

3 个答案:

答案 0 :(得分:4)

您可以使用re模块:

import re
s = 'JHDKFksdKSJDsGGGG'
print re.sub('[A-Z]+','_',s)

基本上,它的作用是用下划线(第二个参数)替换大写的簇([A-Z]+部分)。

[A-Z]匹配AZ中的任何大写字符,而+表示您希望与至少一个字符匹配(您不希望用下划线替换空字符串)。

因此,[A-Z]+匹配一组大写字母。

所以re.sub所做的是它接受3个参数(模式,替换和字符串)。它遍历字符串,寻找与模式匹配的东西(在这种情况下:看起来像一组大写字符),并用替换字符串替换这些组。

答案 1 :(得分:3)

>>> import re
>>> re.sub("[A-Z]+", "_", "JHDKFksdKSJDsGGGG")
'_ksd_s_'

[A-Z]表示匹配A-Z范围内的任何字符 +表示匹配前一个表达式中的一个或多个。

答案 2 :(得分:1)

强制性非正则性解决方案:

>>> from itertools import groupby
>>> s = "JHDKFksdKSJDsGGGG"
>>> ''.join('_' if k else ''.join(g) for k,g in groupby(s, str.isupper))
'_ksd_s_'
如果它们具有相同的值,则

groupby将可迭代的连续元素组合在一起,在这种情况下由keyfunction str.isupper指定。 IOW,groupby生成

>>> [(k, list(g)) for k,g in groupby(s, str.isupper)]
[(True, ['J', 'H', 'D', 'K', 'F']), (False, ['k', 's', 'd']), 
(True, ['K', 'S', 'J', 'D']), (False, ['s']), (True, ['G', 'G', 'G', 'G'])]

然后我们相应地替换或离开。