Как заменить пользовательские вкладки пробелами в строке, зависит от размера вкладки?

Я пытаюсь написать функцию python, не используя какие-либо модули, которые берут строку с вкладками и заменяют вкладки пробелами, подходящими для введенного размера табуляции. Он не может просто заменить все вкладки размера-n на n пробелов, поскольку вкладка может иметь от 1 до n пробелов. Я действительно смущен, поэтому, если бы кто-нибудь мог просто указать мне в правильном направлении, я бы очень признателен.

Например, если tabstop имеет размер 4 изначально:

123\t123 = 123 123 #one space in between

но изменилось на tabstop 5:

123\t123 = 123  123 #two spaces in between

Мне кажется, мне нужно заполнить конец строки пробелами до тех пор, пока строка% n == 0, а затем не будет обрезана, но в настоящий момент я потерян.

Ответ 1

Поскольку вы не используете функцию python, которая не использует какой-либо внешний модуль, я думаю, вы должны сначала разработать алгоритм вашей функции...

Я бы предложил итерацию на каждом char строки; if char я - вкладка, вам нужно вычислить, сколько пробелов вставить: следующий "выровненный" индекс равен ((i/tabstop) + 1) * tabstop. Поэтому вам нужно вставить ((i/tabstop) + 1) * tabstop - (i% tabstop). Но проще всего вставить вкладки, пока вы не выровняетесь (то есть i% 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

Ответ 2

Для длины вкладки 5:

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

Ответ 3

Я использую функцию .replace, которая очень проста:

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

Ответ 4

Извините, я неправильно понял вопрос в первый раз.

Это рекурсивная версия, которая должна работать для любого количества вкладок на вкладке:

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)

Ответ 5

Я думаю, что ответ Remi самый простой, но он имеет ошибку, он не учитывает случай, когда вы уже находитесь в столбце "tab stop". Том Свинли указал на это в комментариях. Здесь проверено исправление его предложения:

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

Ответ 6

Этот код может помочь вам:

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

Вам нужно будет изучить: форматирование, разделение и объединение функции и понимание понятий списка.

Ответ 7

Эта программа заменяет все вкладки пробелов в файле:

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()

Ответ 8

если у вас есть требование, где вы хотите добавить n пробелов вместо пользовательской вкладки Вы можете просто написать ниже код. Я показал реализацию, используя две функции, каждая из которых имеет свой способ ее решения. Вы можете использовать любую функцию!

например, пусть строка будет в переменной 'code', а 'x' будет размером вкладки

code = "def add(x, y)\f\treturn x + y"
x=4

def convertTabs(code, x):
    temp=""
    for i in range(0,x):
        temp+=" "
    return code.replace("\t",temp) 

def converTabs1(code,x):
    return code.replace("\t",x*" ")

обе приведенные выше функции будут иметь одинаковое значение, но вторая - просто супер!

Ответ 9

Мне нужно было что-то похожее, вот что я придумал:

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'

Ответ 10

Использовать re.sub достаточно.

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

Ответ 11

Вот самый простой способ

def replaceTab(text,tabs)
    return text.replace('\t', ' ' * tabs)