2013-04-17 6 views
9

मैं एक पाइथन फ़ंक्शन लिखने की कोशिश कर रहा हूं जो किसी भी मॉड्यूल का उपयोग नहीं कर रहा है जो एक स्ट्रिंग लेगा जिसमें टैब हैं और टैब को एक इनपुट टैबस्टॉप आकार के लिए उपयुक्त रिक्त स्थान के साथ प्रतिस्थापित करें। यह सिर्फ सभी आकार-एन टैब को एन रिक्त स्थान से प्रतिस्थापित नहीं कर सकता है, क्योंकि एक टैब 1 से एन रिक्त स्थान हो सकता है। मैं वास्तव में उलझन में हूं, इसलिए यदि कोई मुझे सही दिशा में इंगित कर सकता है तो मैं इसकी सराहना करता हूं।स्ट्रिंग में रिक्त स्थान के साथ कस्टम टैब को कैसे प्रतिस्थापित करें, टैब के आकार पर निर्भर करते हैं?

123\t123 = 123 123 #one space in between 

लेकिन tabstop करने के लिए 5 बदला:

123\t123 = 123 123 #two spaces in between 

मुझे लगता है मैं पैड को स्ट्रिंग जब तक रिक्त स्थान के साथ स्ट्रिंग के अंत की जरूरत

उदाहरण के लिए, यदि tabstop मूल रूप से 4 आकार है % n == 0 और फिर इसे खंडित करें, लेकिन मैं इस समय बहुत खो गया हूं ..

+0

क्या आप प्रत्येक टैब (\ t) के लिए "_" चाहते हैं? – Zangetsu

+1

आपके प्रश्न –

+0

पर टेस्टकेस का एक समूह जोड़ने का अच्छा विचार होगा, यदि ब्लॉजिज़ 5 है और स्ट्रिंग अधिक लंबा है, तो क्या होगा। 123456 \ t? परिणाम है: 1234_56___? 1234_6____? 123456_? – emigue

उत्तर

2

चूंकि आप एक अजगर समारोह है कि किसी भी बाहरी मॉड्यूल का उपयोग नहीं करता wan't, मुझे लगता है कि आप डिजाइन चाहिए पहले आपके फ़ंक्शन का एल्गोरिदम ...

मैं स्ट्रिंग के प्रत्येक चार पर पुनरावृत्ति का प्रस्ताव दूंगा; यदि char मैं एक टैब है, तो आपको गणना करने की आवश्यकता है कि कितनी रिक्त स्थान डालने के लिए: अगला "गठबंधन" अनुक्रमणिका है ((i/tabstop) + 1) * टैबस्टॉप। तो आपको डालने की आवश्यकता है ((i/tabstop) + 1) * टैबस्टॉप - (i% टैबस्टॉप)।

initial_string = "My \tstring \ttest\t" 
block_size = "5" 
"".join([("{block_value:"+str(block_size)+"s}").format(block_value=block) 
    for block in initial_string.split("\t")]) 

आप अध्ययन करने के लिए की आवश्यकता होगी:: प्रारूप, विभाजन लेकिन एक आसान तरीका टैब सम्मिलित करने के लिए जब तक आप गठबंधन कर रहे हैं (यानी मैं% tabstop == 0)

def replace_tab(s, tabstop = 4): 
    result = str() 
    for c in s: 
    if c == '\t': 
     while (len(result) % tabstop != 0): 
     result += ' '; 
    else: 
     result += c  
    return result 
+0

सहायता के लिए सभी को धन्यवाद। यह वही है जो मैं देख रहा था कि मैं सिर्फ एक मानसिक ब्लॉक था जो एल्गोरिदम के चारों ओर अपने दिमाग को लपेटने की कोशिश कर रहा था, इसलिए फिर से धन्यवाद! – Austin

+0

कोई भी जानता है कि पंक्ति में एकाधिक टैब के साथ काम करने के लिए इसे कैसे बदला जाए? ऐसा लगता है कि यह केवल पहले को चुनता है – Austin

+0

परीक्षण में मैंने कई टैब चलाए ठीक थे: replace_tab ('123 \ t12 \ t1 \ t123456 \ t1234 \ t12345678 \ n') '123.12.1.1 ... 123456 .. 123412345678 '(पठनीयता के लिए रिक्त स्थान की जगह वाले बिंदुओं के साथ) –

2

क्षमा करें, मैंने पहली बार प्रश्न को गलत तरीके से पढ़ा।

यह एक पुनरावर्ती संस्करण है कि इनपुट में टैब के किसी भी संख्या के लिए काम करना चाहिए है:

def tabstop (s , tabnum = 4): 
    if not '\t' in s: 
     return s 
    l = s.find('\t') 
    return s[0:l]+' '*(tabnum-l)+tabstop(s[l+1:],tabnum) 
+0

उदाहरणों पर इसे आजमाएं – jamylak

1

इस कोड को आपकी मदद कर सकता है और समारोह और सूची समझ अवधारणा में शामिल हों।

4

5 का एक टैब लंबाई के लिए:

>>> s = "123\t123" 
>>> print ''.join('%-5s' % item for item in s.split('\t')) 
123 123 
>>> 
+2

या: '(5 * '')। Join (s.split ('\ t'))' –

1

इस programm एक फ़ाइल में रिक्त स्थान के लिए सभी टैब की जगह:

def tab_to_space (line, tab_lenght = 8): 
    """this function change all the tabs ('\\t') for spaces in a string, 
     the lenght of the tabs is 8 by default""" 

    while '\t' in line: 
     first_tab_init_pos = line.find('\t') 
     first_tab_end_pos = (((first_tab_init_pos // tab_lenght)+1) * tab_lenght) 
     diff = first_tab_end_pos - first_tab_init_pos 
     if diff == 0: 
      spaces_string = ' ' * tab_lenght 
     else: 
      spaces_string = ' ' * diff 
     line = line.replace('\t', spaces_string, 1) 
    return line 


inputfile = open('inputfile.txt', 'r') 
outputfile = open('outputfile.txt', 'w') 
for line in inputfile: 
    line = tab_to_space(line) 
    outputfile.write(line) 
inputfile.close() 
outputfile.close() 
0

मैं कुछ इसी तरह की जरूरत है, यहाँ क्या मैं के साथ आया है:

import re 

def translate_tabs(tabstop = 8): 
    offset = [0] 
    def replace(match, offset=offset): 
    offset[0] += match.start(0) 
    return " " * (tabstop - offset[0] % tabstop) 
    return replace 

re.sub(r'\t', translate_tabs(4), "123\t123") 
# => '123 123' 

re.sub(r'\t', translate_tabs(5), "123\t123") 
# => '123 123' 
0

मुझे लगता है कि रेमी का जवाब सबसे आसान है लेकिन इसमें एक बग है, यह उस मामले के लिए जिम्मेदार नहीं है जब आप हैं पहले से ही "टैब स्टॉप" कॉलम पर। टॉम स्वाइली ने टिप्पणियों में इसे इंगित किया।

line = line.replace('\t', ' ') 
3

: यहाँ उनके सुझाव के लिए एक परीक्षण किया ठीक है।

def untabify(s, tabstop = 4): 
    return re.sub(re.compile(r'\t'), ' '*tabstop, s) 
0

उपयोग re.sub पर्याप्त है: मैं .replace समारोह है कि बहुत सरल है का उपयोग

def replace_tab(s, tabstop = 4): 
    result = str() 

    for c in s: 
     if c == '\t': 
      result += ' ' 
      while ((len(result) % tabstop) != 0): 
       result += ' ' 
     else: 
      result += c  

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

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