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

如何在Python中用一个下划线替换所有连续的大写字母,python,regex,Python,Regex,比如说 “JHDKFKSJDSGGGG”变为“\u ksd\u s” 有没有一种方法可以用一个下划线替换大写的集群?您可以使用re模块: import re s = 'JHDKFksdKSJDsGGGG' print re.sub('[A-Z]+','_',s) 基本上,它用下划线(第二个参数)替换大写的集群(A-Z)+部分) [A-Z]匹配从A到Z的任何大写字符,+表示您希望与至少一个字符匹配(您不希望用下划线替换空字符串) 因此,[A-Z]+一起匹配一组大写字母 因此,re.sub所做的是

比如说

“JHDKFKSJDSGGGG”变为“\u ksd\u s”


有没有一种方法可以用一个下划线替换大写的集群?

您可以使用
re
模块:

import re
s = 'JHDKFksdKSJDsGGGG'
print re.sub('[A-Z]+','_',s)
基本上,它用下划线(第二个参数)替换大写的集群(A-Z)+部分)

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

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

因此,
re.sub
所做的是它接受3个参数(模式、替换和字符串)。它遍历字符串,查找与模式匹配的内容(在本例中:看起来像一组大写字符),并用替换字符串替换这些组

>>> import re
>>> re.sub("[A-Z]+", "_", "JHDKFksdKSJDsGGGG")
'_ksd_s_'
[A-Z]
表示匹配A-Z范围内的任何字符。

+
表示匹配前面的一个或多个表达式。

强制非正则表达式解决方案:

>>> from itertools import groupby
>>> s = "JHDKFksdKSJDsGGGG"
>>> ''.join('_' if k else ''.join(g) for k,g in groupby(s, str.isupper))
'_ksd_s_'
groupby
如果iterable的相邻元素具有相同的值,则将它们分组在一起,在这种情况下,由keyfunction
str.isupper
指定。下面,
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'])]

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

您尝试过什么?如果你自己不能开始做这件事,最好不要使用正则表达式。这其中的每一部分意味着什么?[A-Z]与集群或组不匹配。它是一个字符类,匹配a-Z范围内的单个字符,即任何大写字母。正是+使其成为“集群”(匹配前面的一个或多个字符或类)。谢谢!我已经更新了我的答案。