正则表达式并删除字符串两部分之间的特定制表符

Regex and removing specific tabs between two parts of a string

我需要删除一行中两个部分之间的制表符。我有一个大约有 50 万行的大文本文件。我需要将它们放入一个 csv 中,我正在尝试使用 '\t' 分隔符对 pandas 进行处理,但是 'Body' 列中有 '\t',这会在转换时弄乱数据到 csv。

所以在我使用 pandas 之前,我现在尝试遍历每一行,并将“/t”替换为 From 的最后一个数字之间的空格,包括尾随的“\t”和 Type 列'SM' 包括 'SM' 之前的 '\t'。示例如下:

ID      TO          FROM        BODY                        TYPE  OTHER COLUMNS
2501    12345678910 12345678910 40m Test Content     Here.  SMxx  x x x x x x x
2502    1234567891  1234567891  Varying Content  Here.      SMxx  x x x x x x x 

到目前为止,我已经设法编写了一个 reg ex,它将找到 '\tSM',目标是替换此 regex 之前的任何制表符:

(?<![\w\d])\tSM(?![\w\d])

然后我尝试编写一个可以查看任何长于 9 但小于 13 的数字之后的内容,但我无法让它工作。

我不确定最好的方法是查找和替换 txt 文件 'Body' 部分中的所有 '\t',同时保留所有其他 '\t' 分隔符。

感谢任何帮助:)

您可以使用

import re
rx = re.compile(r'^((?:[^\t]*\t){3})(.*?)(?=\t\s*SM)')
with open(filepath, 'r') as f:
    with open(f"{filepath}.out", 'w', newline="\n", encoding="utf-8") as fw:
        for line in f:
            fw.write(rx.sub(lambda x: f"{x.group(1)}{x.group(2).replace(chr(9), '')}", line))

Python demo

import re
line = '    2501    12345678910 12345678910 40m Test Content\t Here.    SMxx  x x x x x x x'
rx = re.compile(r'^((?:[^\t]*\t){3})(.*?)(?=\t\s*SM)')
print(rx.sub(lambda x: f"{x.group(1)}{x.group(2).replace(chr(9), '<TAB WAS HERE>')}", line))
# =>     2501   12345678910 12345678910 40m Test Content<TAB WAS HERE> Here.    SMxx  x x x x x x x

regex demo详情:

  • ^ - 字符串开头
  • ((?:[^\t]*\t){3}) - 第 1 组:三个零个或多个 TAB 以外的字符,然后是 TAB 字符
  • (.*?) - 第 2 组:除换行字符外的任何零个或多个字符尽可能少
  • (?=\t\s*SM) - 需要 TAB、零个或多个空格然后 SM 紧邻当前位置右侧的正向前瞻。

替换是第 1 组值 (x.group(1)) 和第 2 组值的串联,所有 TAB 都替换为空字符串 (x.group(2).replace(chr(9), ''))。