11

我正在尝试编写一个不使用任何模块的python函数,该模块将采用具有制表符的字符串并将制表符替换为适合输入制表位大小的空格。但是,它不能只用 n 个空格替换所有大小为 n 的制表符,因为制表符可以是 1 到 n 个空格。我真的很困惑,所以如果有人能指出我正确的方向,我将不胜感激。

例如,如果 tabstop 最初的大小为 4:

123\t123 = 123 123 #one space in between

但改为制表位 5:

123\t123 = 123  123 #two spaces in between

我想我需要用空格填充字符串的末尾,直到 string%n==0 然后分块它,但我现在很迷茫..

4

12 回答 12

5

对于 5 的制表符长度:

>>> s = "123\t123"
>>> print ''.join('%-5s' % item for item in s.split('\t'))
123  123  
>>> 
于 2013-04-17T07:24:00.480 回答
4

既然你不想要一个不使用任何外部模块的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
于 2013-04-17T06:38:55.827 回答
4

我使用非常简单的 .replace 函数:

line = line.replace('\t', ' ')
于 2015-11-17T09:54:13.740 回答
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)
于 2013-04-17T06:16:01.320 回答
2

我认为 Remi 的答案是最简单的,但它有一个错误,当您已经在“制表位”列时,它没有考虑到这种情况。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
于 2015-11-12T00:04:47.543 回答
1

该程序替换文件中空格的所有制表符:

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()
于 2014-06-29T06:42:59.250 回答
1

此代码可以帮助您:

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

您将需要学习:格式、拆分和连接功能以及列表理解概念。

于 2013-04-17T07:12:24.370 回答
1

if you have the requirement where you want to add n spaces instead of custom tab you can simply write below code. I have shown the implementation using two functions, each having different way to solve it.You can use any of the function!

for eg. let the string be in the variable 'code' and 'x' be the size of tab

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

both the functions above will give the same value, but the second one is super awesome !

于 2018-04-11T20:35:06.067 回答
1

这是最简单的方法

def replaceTab(text,tabs)
    return text.replace('\t', ' ' * tabs)
于 2019-09-05T17:41:25.223 回答
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'
于 2014-08-20T16:39:26.603 回答
0

修复@rémi 答案此实现尊重前导选项卡和任何连续选项卡

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
于 2020-08-07T07:15:36.530 回答
0

使用 re.sub 就足够了。

def untabify(s, tabstop = 4):
    return re.sub(re.compile(r'\t'), ' '*tabstop, s)
于 2016-09-07T09:20:52.683 回答