正则表达式并删除字符串两部分之间的特定制表符
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))
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), '')
)。
我需要删除一行中两个部分之间的制表符。我有一个大约有 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))
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), '')
)。