例如
" JHDKFksdKSJDsGGGG"成为" _ksd_s _"
有没有办法用单个下划线替换大写集群?
答案 0 :(得分:4)
您可以使用re
模块:
import re
s = 'JHDKFksdKSJDsGGGG'
print re.sub('[A-Z]+','_',s)
基本上,它的作用是用下划线(第二个参数)替换大写的簇([A-Z]+
部分)。
[A-Z]
匹配A
到Z
中的任何大写字符,而+
表示您希望与至少一个字符匹配(您不希望用下划线替换空字符串)。
因此,[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'])]
然后我们相应地替换或离开。