在单行文本文件中的数字后添加新行

时间:2018-11-15 03:20:11

标签: python python-3.x

我在一个文本文件中有一个巨大的HPBasic代码字符串,例如:

  

158! 159 SUBEXIT 160! 161 Prntr_available:!如果打印机不是162,则不允许进入测试菜单!可用结果仅送到打印机163 IF条件$(15,2)[6,6] <>“ *”然后!打印机不可用164 Cond_error = 1 165 Prompt_user(“错误:打印机不可用;无法执行测试。”)

那些连续的数字是代码中的新行。如何在每个数字之前对此进行迭代以打印换行符以使其可读?现在我有:

mystring = ('EnormousString')
myString.replace('1', '1\n')

这种作品。有没有办法为此添加+=1?不知道该去哪里。

4 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

output = []
curline = 0
for token in s.split(' '):
  try:
    line = int(token)
    if line > curline:
      curline = line
      output.append('\n')
  except:
    pass
  output.append(token)

output_str = ' '.join(output).lstrip() # lstrip removes the leading \n

这不是假定行号都比最后一行大一(但可以添加),因为我相信BASIC只要求它比前一行大。正如其他人提到的那样,如果一行中有更大的数字(用空格包围),则可能会中断。

答案 1 :(得分:0)

此def将执行此操作(如下)。它要求所有连续的行分隔数字都按顺序出现,并且我要求每个数字之间都必须有空格,以减少由于(例如)出现在文本前的数字3而导致丢失信息的可能性。第3行分隔符。为了防止行分割“ 3”(由于某种原因在第3行分隔符之后发生),我使用了maxsplit = 1(即str.split([sep[, maxsplit]])),因此它仅使用了“ 3”的第一个实例:

def split_text(text):
    i, sep, tail = 1, '1 ', text
    while sep in tail:
        head, tail = tail.split(sep, 1)
        print(head)
        i += 1
        sep = ' ' + str(i) + ' '
    print(tail)

将其添加到文件应该很简单。

答案 2 :(得分:0)

这假定文本的第一部分将始终是行号,如果输入有效,则应使用该行号。它还假定行本身将永远不会包含两个空格之间的下一个行号。这不是一个很好的假设,但是如果不以某种方式集成HPBasic解析器,我认为没有很多解决方法。

code = """158 ! 159 SUBEXIT 160 ! 161 Prntr_available: ! Cannot allow entry to Test Menu if printer is not 162 ! available; results only go to printer 163 IF Conditions$(15,2)[6,6]<>"*" THEN ! Printer is not available 164 Cond_error=1 165 Prompt_user("ERROR: Printer not available; cannot perform tests.")"""
line_number = int(code[:code.index(" ")])

lines = []
string_index = 0

while True:
    line_number += 1

    try:
        next_index = code.index(" " + str(line_number) + " ", string_index)
    except ValueError:
        lines.append(code[string_index:].strip())
        break

    lines.append(code[string_index:next_index].strip())
    string_index = next_index

print "\n".join(lines)
# 158 ! 
# 159 SUBEXIT 
# 160 ! 
# 161 Prntr_available: ! Cannot allow entry to Test Menu if printer is not 
# 162 ! available; results only go to printer 
# 163 IF Conditions$(15,2)[6,6]<>"*" THEN ! Printer is not available 
# 164 Cond_error=1
# 165 Prompt_user("ERROR: Printer not available; cannot perform tests.")

答案 3 :(得分:0)

只要找到3位数字,用正则表达式替换怎么样?

import re
mystring = '158 ! 159 SUBEXIT 160 ! 161 Prntr_available: ! Cannot allow entry to Test Menu if printer is not 162 ! available; results only go to printer 163 IF Conditions$(15,2)[6,6]<>"*" THEN ! Printer is not available 164 Cond_error=1 165 Prompt_user("ERROR: Printer not available; cannot perform tests.")'
print((re.sub(r"(\d{3})",r"\n\1", mystring)))

这将给出以下输出:

158 ! 
159 SUBEXIT 
160 ! 
161 Prntr_available: ! Cannot allow entry to Test Menu if printer is not 
162 ! available; results only go to printer 
163 IF Conditions$(15,2)[6,6]<>"*" THEN ! Printer is not available 
164 Cond_error=1 
165 Prompt_user("ERROR: Printer not available; cannot perform tests.")