2017-09-22 3 views
6

मैं इस कॉलम में तारों के अंत को पट्टी करने की कोशिश कर रहा हूं। मैंने देखा है कि किसी स्ट्रिंग के अंत में एक विशिष्ट वर्ण, या वर्णों की एक सेट संख्या को कैसे रैस्ट्रिप करना है, लेकिन आप इसे पैटर्न के आधार पर कैसे करते हैं?पायथन rstrip या charachters के पैटर्न द्वारा स्ट्रिंग के अंत को हटाएं

मैं 'team' कॉलम में तारों के पूरे छोर को हटाना चाहता हूं, जहां हम ऊपरी मामले के बाद लोअरकेस देखते हैं। फिर अपरकेस पर शुरू करें।

team        pts/g 
St. Louis RamsSt. Louis    32.875 
Washington RedskinsWashington  27.6875 
Minnesota VikingsMinnesota   24.9375 
Indianapolis ColtsIndianapolis  26.4375 
Oakland RaidersOakland    24.375 
Carolina PanthersCarolina   26.3125 
Jacksonville JaguarsJacksonville 24.75 
Chicago BearsChicago    17.0 
Green Bay PackersGreen Bay   22.3125 
San Francisco 49ersSan Francisco 18.4375 
Buffalo BillsBuffalo    20.0 

इस तरह देखने के लिए:

team        pts/g 
St. Louis Rams      32.875 
Washington Redskins     27.6875 
Minnesota Vikings     24.9375 
Indianapolis Colts     26.4375 
Oakland Raiders      24.375 
Carolina Panthers     26.3125 
Jacksonville Jaguars    24.75 
Chicago Bears      17.0 
Green Bay Packers     22.3125 
San Francisco 49ers     18.4375 
Buffalo Bills      20.0 

उत्तर

5

आप उस के लिए re.sub(pattern, repl, string) उपयोग कर सकते हैं मैं नीचे 'team' स्तंभ चाहते हैं।

के मिलान के लिए इस रेगुलर एक्सप्रेशन का उपयोग करते हैं:

([a-z])[A-Z].*?() 

इसे किसी लोअरकेस वर्ण ([a-z]), एक अपरकेस चरित्र [A-Z] और किसी भी चरित्र .*? के बाद से मेल खाता है, जब तक यह दो रिक्त स्थान () पूरी करता है। लोअरकेस वर्ण और दो रिक्त स्थान एक समूह में हैं, इसलिए वे पहली और \2 दूसरे समूह के लिए के लिए \1 का उपयोग करते समय re.sub का उपयोग कर फिर से डाला जा सकता है:

new_text = re.sub(r"([a-z])[A-Z].*?()", r"\1\2", text) 

अपने उदाहरण के लिए आउटपुट:

team        pts/g 
St. Louis Rams    32.875 
Washington Redskins  27.6875 
Minnesota Vikings   24.9375 
Indianapolis Colts  26.4375 
Oakland Raiders    24.375 
Carolina Panthers   26.3125 
Jacksonville Jaguars 24.75 
Chicago Bears    17.0 
Green Bay Packers   22.3125 
San Francisco 49ers 18.4375 
Buffalo Bills    20.0 

इसने स्पेस-संरेखण को गड़बड़ कर दिया। आप के लिए प्रासंगिक नहीं हो सकता है, लेकिन अगर आप अंतरिक्ष के साथ मिटा दिया वर्ण बदलना चाहते हैं, तो आप re.sub करने के लिए एक प्रतिस्थापन स्ट्रिंग है, जो एक Match वस्तु लेता है और रिटर्न के बजाय एक समारोह पारित कर सकते हैं एक str:

def replace_with_spaces(match): 
    return match.group(1) + " "*len(match.group(2)) + match.group(3) 

और तो इस तरह से इसका इस्तेमाल करते हैं (ध्यान दें कि किस मैं भी एक regex-समूह में होने वाली प्रतिस्थापित हिस्सा डाल):

new_text re.sub(r"([a-z])([A-Z].*?)()", replace_with_spaces, text) 

यह पैदा करता है:

team        pts/g 
St. Louis Rams      32.875 
Washington Redskins     27.687 
Minnesota Vikings     24.937 
Indianapolis Colts     26.437 
Oakland Raiders      24.375 
Carolina Panthers     26.312 
Jacksonville Jaguars    24.75 
Chicago Bears      17.0 
Green Bay Packers     22.312 
San Francisco 49ers     18.437 
Buffalo Bills      20.0 
+0

फिर, संरेखण कोई फर्क नहीं पड़ता: यहाँ एक छोटे से समारोह और उसके परीक्षण है। लेकिन ग्रहण के लिए भी धन्यवाद। यह सीखने में बहुत मददगार है कि यह कैसे काम करता है। – chitown88

+0

मैंने संरेखण को वैसे भी रखने के लिए एक तरीका शामिल करने के लिए उत्तर का विस्तार किया – Felk

0

खैर, मुझे यह बात नहीं है कि यह इतना आसान है: रिक्त स्थान की वजह से जो 2 शब्दों को अलग कर सकते हैं जिन्हें हटाया जाना चाहिए। मैं सुझाव देता हूं कि केवल आपकी समस्या के लिए, सबसे छोटे अंत को हटाने के लिए जो भीख मांगना है। हम ... व्याख्या करने के लिए बहुत आसान नहीं है।

def smart_rstrip (s): 
    for i in xrange(1,len(s)): 
     if s.endswith(s[:i]): 
      return s[:-i] 
    return s 


s = ['St. Louis RamsSt. Louis', 'Washington RedskinsWashingt...] 
print '\n'.join(s) 
print '\n'.join(map(smart_rstrip,s)) 

कोशिश करो, मैं बात तुम क्या चाहते हो जाएगा ...

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