如何用字符串中的空格替换自定义制表符,取决于制表符的大小



我试图编写一个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  "

相关内容

  • 没有找到相关文章

最新更新