例如
“JHDKFksdKSJDsGGGG”变为“_ksd_s_”
有没有办法用单个下划线替换大写集群?
您可以使用re
模块:
import re
s = 'JHDKFksdKSJDsGGGG'
print re.sub('[A-Z]+','_',s)
基本上,它的作用是[A-Z]+
用下划线(第二个参数)替换大写的簇(部分)。
[A-Z]
A
匹配从to的任何大写字符Z
以及+
您希望与至少一个字符匹配的方式(您不想用下划线替换空字符串)。
因此,一起[A-Z]+
匹配一组大写字母。
所以re.sub
它接受了 3 个参数(模式、替换和字符串)。它遍历字符串,寻找与模式匹配的内容(在这种情况下:看起来像一组大写字符),并用替换字符串替换这些组。
>>> import re
>>> re.sub("[A-Z]+", "_", "JHDKFksdKSJDsGGGG")
'_ksd_s_'
[A-Z]
表示匹配 AZ 范围内的任何字符。
+
表示匹配一个或多个前面的表达式。
强制性的非正则表达式解决方案:
>>> 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'])]
然后我们相应地替换或不理会。