-1

例如

“JHDKFksdKSJDsGGGG”变为“_ksd_s_”

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

4

3 回答 3

4

您可以使用re模块:

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

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

[A-Z]A匹配从to的任何大写字符Z以及+您希望与至少一个字符匹配的方式(您不想用下划线替换空字符串)。

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

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

于 2013-07-25T01:40:05.187 回答
3
>>> import re
>>> re.sub("[A-Z]+", "_", "JHDKFksdKSJDsGGGG")
'_ksd_s_'

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

于 2013-07-25T01:40:31.357 回答
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'])]

然后我们相应地替换或不理会。

于 2013-07-25T01:56:08.343 回答