我试图编写一个python函数,不使用任何模块,该模块将采用具有制表符的字符串,并将制表符替换为适合输入制表符大小的空格。它不能用n个空格替换所有大小为n的制表符,因为一个制表符可以是1到n个空格。我真的很困惑,所以如果有人能给我指出正确的方向,我会非常感激。
例如,如果制表符原来的大小是4:
123t123 = 123 123 #one space in between
,但改为tabstop 5:
123t123 = 123 123 #two spaces in between
我想我需要用空格填充字符串的末尾,直到字符串%n==0,然后块它,但我现在很迷路。
标签长度为5:
>>> s = "123t123"
>>> print ''.join('%-5s' % item for item in s.split('t'))
123 123
>>>
既然你不想要一个不使用任何外部模块的python函数,我认为你应该首先设计你的函数的算法…
我建议对字符串的每个字符进行迭代;如果char I是一个制表符,您需要计算要插入多少个空格:下一个"对齐"索引是((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
我使用。replace函数,这是非常简单的:
line = line.replace('t', ' ')
对不起,我第一次看错了问题。
这是一个递归的版本,应该适用于输入中的任意数量的制表符:
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)
我认为Remi的答案是最简单的,但它有一个bug,它没有考虑到当你已经在"制表符"列上的情况。Tom Swirly在评论中指出了这一点。下面是对他的建议的测试修复:
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
这是最简单的方法
def replaceTab(text,tabs)
return text.replace('t', ' ' * tabs)
以下代码可以帮助您:
initial_string = "My tstring ttestt"
block_size = "5"
"".join([("{block_value:"+str(block_size)+"s}").format(block_value=block)
for block in initial_string.split("t")])
你将需要学习:格式,分割和连接函数和列表理解的概念。
这个程序替换文件中所有的制表符:
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()
如果您需要添加n个空格而不是自定义制表符您可以简单地编写下面的代码。我已经展示了使用两个函数的实现,每个函数都有不同的解决方法。您可以使用任何函数!
例如。让字符串在变量'code'中,'x'的大小为tab
code = "def add(x, y)ftreturn 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*" ")
上面的两个函数将给出相同的值,但第二个函数非常棒!
我需要类似的东西,下面是我想到的:
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), "123t123")
# => '123 123'
re.sub(r't', translate_tabs(5), "123t123")
# => '123 123'
使用re.sub就足够了。
def untabify(s, tabstop = 4):
return re.sub(re.compile(r't'), ' '*tabstop, s)
修复了@ rsammi的答案这个实现尊重前导制表符和任何连续制表符
def replace_tab(s, tabstop=4):
result = str()
for c in s:
if c == 't':
if (len(result) % tabstop == 0):
result += ' ' * tabstop
else:
while (len(result) % tabstop != 0):
result += ' '
else:
result += c
return result
def expand_tabs(text: str, width: int = 8) -> str:
"""
Expand each tab to one or more spaces
"""
assert width > 0
while (i := text.find('t')) >= 0:
text = text[:i] + ' ' * (width - i % width) + text[i+1:]
return text
只是因为下面的内容不适合对kzar的答案进行注释,kzar提出了一个非常有趣的方法(它没有回答问题,因为它使用了一个模块),但它没有正确:
import re
offsetAddon = 0
def spaces(tabSize=8):
def replace(match):
global offsetAddon
spaceMultipl = (tabSize - (match.start(0) + offsetAddon) % tabSize)
offsetAddon += (spaceMultipl - 1)
return " " * spaceMultipl
return replace
tab=r't'
s="t1t12t123t1234t12345t123456t1234567t12345678t12t"
print(f'''"{re.sub(tab, spaces(4), s)}"''') # gives:
# " 1 12 123 1234 12345 123456 1234567 12345678 12 "