11

タブを持つ文字列を取り、入力されたタブストップのサイズに適したスペースにタブを置き換えるモジュールを使用しない python 関数を作成しようとしています。ただし、タブは 1 ~ n 個のスペースである可能性があるため、サイズ n のすべてのタブを 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

非常に単純な .replace 関数を使用します。

line = line.replace('\t', ' ')
于 2015-11-17T09:54:13.740 に答える
4

外部モジュールを使用しないPython関数は必要ないので、最初に関数のアルゴリズムを設計する必要があると思います...

string のすべての文字を反復処理することを提案します。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 に答える
2

レミの答えが最も簡単だと思いますが、バグがあり、すでに「タブストップ」列にいる場合は考慮されていません。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 に答える
2

すみません、初めて質問を読み違えました。

これは、 input 内の任意の数のタブで機能する再帰バージョンです。

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 に答える
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

このプログラムは、ファイル内のスペースのすべてのタブを置き換えます。

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 に答える
0

re.sub を使用するだけで十分です。

def untabify(s, tabstop = 4):
    return re.sub(re.compile(r'\t'), ' '*tabstop, s)
于 2016-09-07T09:20:52.683 に答える
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 に答える