2010-11-10 20 views
24

के साथ पाइथन में ऊपरी केस दोहराए गए अक्षरों को प्रतिस्थापित करने के लिए नियमित अभिव्यक्ति का उपयोग करना मैं अपरकेस अक्षरों के किसी भी उदाहरण को प्रतिस्थापित करने की कोशिश कर रहा हूं जो स्ट्रिंग में खुद को दो बार दोहराता है जिसमें कम अक्षर में उस अक्षर के एक उदाहरण के साथ दोहराया जाता है। मैं निम्नलिखित नियमित अभिव्यक्ति का उपयोग कर रहा हूं और यह दोहराए गए ऊपरी केस अक्षरों से मेल खाता है, लेकिन मुझे यकीन है कि कम केस को प्रतिस्थापित करने वाले पत्र को कैसे बनाया जाए।एक ही लोअरकेस अक्षर

import re 
s = 'start TT end' 
re.sub(r'([A-Z]){2}', r"\1", s) 
>>> 'start T end' 

मैं "\ 1" निचला मामला कैसे बना सकता हूं? क्या मुझे ऐसा करने के लिए नियमित अभिव्यक्ति का उपयोग नहीं करना चाहिए?

+0

यह लोअरकेस बनाने के लिए कैसे, लेकिन अपने उपयोग करना चाहिए ' '([AZ]) {2,}'' 'बजाय '([AZ]) {2}'' किसी भी बदलने के लिए पता नहीं है उदाहरणों। – khachik

+0

आपका रेगेक्स भी दो अलग-अलग कैप्स से मेल खाता है। –

उत्तर

39

Pass a functionrepl तर्क के रूप में। MatchObject इस समारोह के लिए पारित कर दिया है और .group(1) पहले parenthesized उपसमूह देता है:

import re 
s = 'start TT end' 
callback = lambda pat: pat.group(1).lower() 
re.sub(r'([A-Z]){2}', callback, s) 

संपादित
और हाँ, आप ([A-Z])\1 बजाय ([A-Z]){2} क्रम में नहीं मैच के लिए उदाहरण के लिए उपयोग करना चाहिए AZ। (@ Bobince के answer देखें।)

import re 
s = 'start TT end' 
re.sub(r'([A-Z])\1', lambda pat: pat.group(1).lower(), s) # Inline 

देता है:

'start t end' 
+0

धन्यवाद, मैं आपकी मदद की सराहना करता हूं। – ajt

+0

@ajt आपका स्वागत है। – jensgram

1

आप एक नियमित अभिव्यक्ति के साथ ऐसा कर सकते हैं, बस स्थानापन्न के रूप में एक समारोह पारित the docs की तरह कहते हैं। समस्या आपका पैटर्न है।

जैसा कि है, आपका पैटर्न किसी भी दो पूंजी अक्षरों से मेल खाता है। मैं आपको वास्तविक पैटर्न छोड़ दूंगा, लेकिन यह AA|BB|CC| से शुरू होता है।

6

आप प्रतिस्थापन स्ट्रिंग में केस नहीं बदल सकते हैं। आप एक प्रतिस्थापन समारोह की आवश्यकता होगी:

>>> def replacement(match): 
...  return match.group(1).lower() 
... 
>>> re.sub(r'([A-Z])\1', replacement, 'start TT end') 
'start t end' 
0

'repl' पैरामीटर की पहचान प्रतिस्थापन या तो एक स्ट्रिंग हो सकती है (आप इसे यहाँ के रूप में) या एक समारोह। यह तुम क्या चाहते हो जाएगा:

import re 

def toLowercase(matchobj): 
    return matchobj.group(1).lower() 

s = 'start TT end' 
re.sub(r'([A-Z]){2}', toLowercase, s) 
>>> 'start t end' 
0

इस प्रयास करें:

def tol(m): 
    return m.group(0)[0].lower() 

s = 'start TTT AAA end' 
re.sub(r'([A-Z]){2,}', tol, s) 

ध्यान दें कि यह झुलसाना ऊपरी पत्र को प्रतिस्थापित नहीं करता। यदि आप इसे करना चाहते हैं, तो r'([A-Z]){1,}' का उपयोग करें।

+0

ओपी कहता है: * दो बार दोहराएं * – SilentGhost

+0

@SilentGost। मेरी गलती। इग्नासिओ द्वारा सुझाए गए अनुसार, यदि एकल ऊपरी वर्णों को छुआ नहीं जाना चाहिए। – khachik

+0

यदि आप देखते हैं और बॉबन्स और जेन्स के जवाब आपको ऐसा करने का छोटा रास्ता देखते हैं। – SilentGhost

0

चेतावनी! इस पोस्ट के रूप में अनुरोध किया गया है। अपनी ज़िम्मेदारी के साथ जारी रखें!

मुझे नहीं पता कि कोने के मामले कितने संभव हैं लेकिन यह सामान्य पाइथन मेरे निष्पक्ष कोडिंग करता है।

import string 
s = 'start TT end AAA BBBBBBB' 
for c in string.uppercase: 
    s = s.replace(c+c,c.lower()) 
print s 
""" Output: 
start t end aA bbbB 
""" 
संबंधित मुद्दे