2010-11-25 16 views
6

मैं मौका करने के लिए एक कारगर तरीका के लिए देख रहा हूँ एक स्ट्रिंग ऐसी है कि अधिक से अधिक 2 बराबर पात्रों के सभी दृश्यों पहले 2.पायथन: कैसे एक स्ट्रिंग

के बाद काट रहे हैं में अधिक से अधिक 2 बराबर वर्णों के क्रम को काट

कुछ इनपुट-> उत्पादन उदाहरण हैं:

hellooooooooo -> helloo 
woooohhooooo -> woohhoo 

मैं वर्तमान से अधिक अक्षर पाशन कर रहा हूँ, लेकिन यह थोड़ा धीमा है। किसी को भी एक और समाधान (regexp या कुछ और)

संपादित है: वर्तमान कोड:

word_new = "" 
     for i in range(0,len(word)-2):  
      if not word[i] == word[i+1] == word[i+2]: 
       word_new = word_new+word[i] 
     for i in range(len(word)-2,len(word)): 
      word_new = word_new + word[i] 
+0

आप अपने वर्तमान कोड पोस्ट कर सके साथ संयोजन के रूप में [^\W\d_]? – Simone

उत्तर

8

संपादित करें: मददगार टिप्पणियाँ

import re 

def ReplaceThreeOrMore(s): 
    # pattern to look for three or more repetitions of any character, including 
    # newlines. 
    pattern = re.compile(r"(.)\1{2,}", re.DOTALL) 
    return pattern.sub(r"\1\1", s) 

(मूल प्रतिक्रिया यहाँ लागू करने के बाद) इस तरह कुछ कोशिश करें:

import re 

# look for a character followed by at least one repetition of itself. 
pattern = re.compile(r"(\w)\1+") 

# a function to perform the substitution we need: 
def repl(matchObj): 
    char = matchObj.group(1) 
    return "%s%s" % (char, char) 

>>> pattern.sub(repl, "Foooooooooootball") 
'Football' 
+0

आप इस पैटर्न का उपयोग कर सकते हैं '(\ w) \ 1 {2,} 'उन अक्षरों से मेल खाने के लिए जो 3 या उससे अधिक समूह में हैं। आप पैटर्न भी जोड़े हिट करता है। –

+0

मुझे लगता है कि आप अंतिम पंक्ति में 'pattern.sub (repl," Foooooooooootball ") का मतलब है, लेकिन इसके अलावा, महान कोड! – EdoDodo

+0

@Edo - पकड़ के लिए धन्यवाद; ठीक कर दिया। @ अल्फा-माउस - सच, लेकिन प्रभावी रूप से नो-ऑप। (एक जोड़ी को एक ही जोड़ी से बदलता है) – bgporter

0

मैं वास्तव में अजगर regexp पता नहीं है, लेकिन आप इस एक अनुकूलन कर सकते हैं:

s/((.)\2)\2+/$1/g; 
1

इसके अलावा एक regex का उपयोग कर, लेकिन बिना एक समारोह:

import re 

expr = r'(.)\1{3,}' 
replace_by = r'\1\1' 

mystr1 = 'hellooooooo' 
print re.sub(expr, replace_by, mystr1) 

mystr2 = 'woooohhooooo' 
print re.sub(expr, replace_by, mystr2) 
+0

यह बिल्कुल तीन समान पात्रों के अनुक्रमों पर काम नहीं करता है, और न्यूलाइन पर हमला नहीं करता है। –

0

मैं अपने कोड पोस्ट, यह regex नहीं है, लेकिन चूंकि आपने "या कुछ और" का उल्लेख किया है ...

def removeD(input): 
if len(input) < 3: return input 

output = input[0:2] 
for i in range (2, len(input)): 
    if not input[i] == input[i-1] == input[i-2]: 
     output += input[i] 

return output 
कम से कम अपने सिस्टम पर - -

(!, मैं वास्तव में इसे पसंद खान से ज्यादा कोई मज़ाक नहीं), लेकिन bgporter के एक के रूप में नहीं है time रिपोर्ट है कि यह हमेशा के लिए तेजी से कार्य करता है।

2

निम्नलिखित कोड (अन्य regexp आधारित जवाब के विपरीत) वास्तव में करता है कि आप क्या कहना है कि आप चाहते हैं: एक ही के 2 से अधिक से अधिक 2 बराबर पात्रों के सभी दृश्यों की जगह। अंक, विराम चिह्न, रिक्त स्थान, टैब, नई-पंक्तियों etcccc:

>>> import re 
>>> text = 'the numberr offf\n\n\n\ntheeee beast is 666 ...' 
>>> pattern = r'(.)\1{2,}' 
>>> repl = r'\1\1' 
>>> re.sub(pattern, repl, text, flags=re.DOTALL) 
'the numberr off\n\nthee beast is 66 ..' 
>>> 

आप वास्तव में कुछ या सभी को यह उपचार लागू करने के लिए नहीं कर सकते हैं। उस स्थिति में आपको अधिक प्रतिबंधक उप-पैटर्न द्वारा . को प्रतिस्थापित करने की आवश्यकता है।

उदाहरण के लिए:

ASCII अक्षरों: [A-Za-z]

कोई भी अक्षर, स्थान के आधार: re.LOCALE झंडा

+0

आप सही हैं, मुझे बस एसीआईआई वर्णों से अधिक प्रतिस्थापित करने की आवश्यकता है। शायद ascii + विराम चिह्न, लेकिन मैंने अभी तक फैसला नहीं किया है। अब मुझे पता है कि यह कैसे करें, धन्यवाद – Bart

संबंधित मुद्दे