Как заменить пользовательские вкладки пробелами в строке, зависит от размера вкладки?
Я пытаюсь написать функцию 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)