2013-07-25 38 views
-1

例如如何以單下劃線代替所有連續的大寫字母在Python

「JHDKFksdKSJDsGGGG」變成「_ksd_s_」

有沒有一種方法以單下劃線來代替大寫集羣?

+1

你試過了什麼?如果你不能自己開始,這可能是一個好主意,以避免正則表達式。 http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist –

回答

4

您可以使用re模塊:

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

基本上,它是它取代了大寫的羣集(該[A-Z]+部分)與下劃線(第二個參數)。

[A-Z]任何大寫字符匹配從AZ+意味着你想有一個匹配至少一個字符(你不想更換空字符串以下劃線)。

因此,[A-Z]+匹配一個大寫字母的集羣。

所以re.sub所做的是它需要3個參數(模式,替換和字符串)。它遍歷字符串,查找與模式匹配的內容(在這種情況下:看起來像一組大寫字符),並用替換字符串替換這些組。

+0

這是什麼意思? – user2597879

+1

[A-Z]與羣集或組不匹配。它是一個與A-Z範圍內的*單個*字符匹配的字符類,即任何大寫字母。它是** + **使其成爲「羣集」(匹配一個或多個前面的字符或類)。 –

+0

謝謝!我已經更新了我的答案。 – jh314

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

[A-Z]意味着匹配在範圍A-Z包括任何字符。
+表示匹配前面的一個或多個表達式。

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'])] 

,然後我們更換或相應單獨離開。

相關問題