如何在Python中对主分隔符使用split函数生成的每6个字符串使用一个辅助分隔符



我有一个管道分隔的文件,它在每6个管道分隔字段后以换行符结束一条记录,如下所示。

uid216|Banana
bunches
nurture|Fail|76|7645|Singer
uid342|Orange
vulture|Pass|56
87|3547|Actor

我使用python中的split函数将文件中的记录转换为字符串列表。

parts = file_str.split('|')

然而,我似乎不明白如何单独使用换行符作为每6个字符串的分隔符。有人能帮帮我吗?

正确的方法可能是使用Python的csv模块读取分隔文件并从文件中流式传输数据,而不是一次将其全部读取到内存中。当您将整个文件读取为字符串时,您基本上必须对其进行两次迭代。

import csv
def process_file(path):
with open(path, 'r') as file_handle:
reader = csv.Reader(file_handle, delimiter='|')
for row in reader:
# row is a list whose entries are the fields of the delimited row;
# do what you want with it.

单词似乎可以跨越管道之间的多行。

您可以读取整个文件,然后使用一个模式将5倍的pip字符与前面和后面的所有单词进行匹配。

^[^|n]+(?:n?[^|n]+)*(?:|[^|n]+(?:n?[^|n]+)*){5}

解释

  • ^字符串开始
  • [^|n]+匹配除|之外的1+个字符或换行符
  • (?:n?[^|n]+)*(可选(匹配可选换行符和除|或换行符之外的1+个字符
  • (?:非捕获组作为一个整体重复
    • |[^|n]+匹配|和除|之外的1+个字符或换行符
    • (?:n?[^|n]+)*可选地重复一个可选的换行符和除|或换行符之外的1+个字符
  • ){5}关闭非捕获组并重复5次以匹配5个管道字符

Regex演示

例如

import re
file = open('file', mode='r')
allText = file.read()
pattern = r"^[^|n]+(?:n?[^|n]+)*(?:|[^|n]+(?:n?[^|n]+)*){5}"
file.close()
for s in re.findall(pattern, allText, re.M):
print(s.split("|"))

输出

['uid216', 'Banananbunchesnnurture', 'Fail', '76', '7645', 'Singer']
['uid342', 'Orangenvulture', 'Pass', '56n87', '3547', 'Actor']

如果后面必须有2个换行符或字符串末尾:

^[^|n]+(?:n?[^|n]+)*(?:|[^|n]+(?:n?[^|n]+)*){5}(?=nn|Z)

Regex演示

parts = []
#iterate over each line by using split on n
# extend to gather all strings in a single list
for line in file_str.split("n"):
parts.extend(line.split("|"))
print(parts)

最新更新