it-roy-ru.com

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

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

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

123\t123 = 123 123 #one space in between

но изменил на табстоп 5:

123\t123 = 123  123 #two spaces in between

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

9
Austin

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

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

Для вкладки длиной 5:

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

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

line = line.replace('\t', ' ')
3
andrea.m.piovesana

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

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

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)
2
ibi0tux

если у вас есть требование, где вы хотите добавить 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*" ")

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

1
Ravi Bhanushali

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

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

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

1
emigue

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

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()
1
Jorge Antonio Galaz

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

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
1
Samuel

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

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
kzar

Используйте re.sub достаточно.

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