Python中使用转义分隔符拆分行

Python中使用转义分隔符拆分行,python,regex,split,negative-lookahead,Python,Regex,Split,Negative Lookahead,TL;博士: 对于的值,无论做什么: line = "one|two|three\|four\|five" fields = line.split(whatever) 我有一个由管道字符分隔的文件。该文件中的某些字段还包括管道,由前导反斜杠转义 例如,此文件中的一行数据的数组表示形式可能为['1'、'2'、'3\'four\'neve'],而此数组表示形式将在文件中表示为1 | 2 | 3\'four\'neve 我无法控制这个文件。我无法预处理该文件。我必须一次完成这件事 我最终需要将此文件

TL;博士:

对于
的值,无论
做什么:

line = "one|two|three\|four\|five"
fields = line.split(whatever)
我有一个由管道字符分隔的文件。该文件中的某些字段还包括管道,由前导反斜杠转义

例如,此文件中的一行数据的数组表示形式可能为
['1'、'2'、'3\'four\'neve']
,而此数组表示形式将在文件中表示为
1 | 2 | 3\'four\'neve

我无法控制这个文件。我无法预处理该文件。我必须一次完成这件事

我最终需要将此文件的每一行拆分为单独的字段,但前面的反斜杠被证明是各种各样的麻烦。我最初尝试使用否定的前瞻性,但是python字符串和双转义字符周围有某种神秘感,我不理解,这让我无法理解


欢迎您对解决方案进行解释,但这是可选的。

也许您可以使用以下内容:

fields == ['one', 'two', 'three\|four\|five']

如果
[^\\]
匹配任何与
\

不同的字符,则可以使用类似正则表达式的

[^\\]\|
它将使用一个字符组来指定除
\
后跟
\
之外的任何内容,并将用于执行拆分

这将在列表的开头提供一个额外的空匹配,但希望您可以像这样解决这个问题

re.split(r'([^|]+[^\\])\|', line)

这仍然受到Wiktor提出的解析问题的影响,当然,这需要一个解析器。那“一\\二”呢?这是它应该做的。那“一\\二”呢?这是理所当然的。当你有转义序列时,正则表达式永远不会准确。这一点是肯定的,但如果出于某种原因需要使用
split
,这可能是你能得到的最接近的结果。我并不介意@WiktorStribiżewc的边缘情况是否得到满足。我不需要对转义字符进行转义。我只需要拆分以不将
r'\\124;'
识别为分隔符。您的(@EricRenouf)建议的解决方案将不起作用,因为一个简单的拆分也将匹配前面字段中的最后一个字符,因此您将得到
['on'、'tw'、'three\\\\\\\\\\\\\\\\\\\\\\\\\\'five']
。我在一个不吸引人的小组和一个消极的前瞻中都尝试过这个方法,但前者无论如何都能吸引人,而后者什么都不能吸引人。@RHill啊,哎呀,我收回我的建议@RHill我刚刚更新了它,希望能解决最后一个字母被抓取的问题,尽管我还没有考虑
pandas
要求编写您自己的解析器来解释转义序列,Python
re
中的正则表达式无法处理它。您能澄清您最终的预期输出是什么吗<代码>['1','2','3\'4\'5']
['1','2','3','4','5']
?@spasic:前者。
re.split(r'([^|]+[^\\])\|', line)[1:]