用于 CSV 拆分的正则表达式,包括多个双引号

Regex for CSV split including multiple double quotes

我有一个包含文本的 CSV 列数据。每行用双引号分隔 "

一行中的示例文本与此类似(注意:新行和每行前的空格是有意的

"Lorem ipsum dolor sit amet, 
 consectetur adipisicing elit, sed do eiusmod
 tempor incididunt ut labore et dolore magna 
 aliqua. Ut ""enim ad"" minim veniam,
 quis nostrud exercitation ullamco laboris nisi 
 ut aliquip ex ea commodo
 consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
 cillum dolore eu fugiat ""nulla pariatu"""
"ex ea commodo
 consequat. Duis aute irure ""dolor in"" reprehenderit 
 in voluptate velit esse
 cillum dolore eu fugiat nulla pariatur. 
 Excepteur sint occaecat cupidatat non
 proident, sunt in culpa qui officia deserunt 
 mollit anim id est laborum."

以上代表2个后续行。

我想 select 将每个第一个双引号 "(开始一行)和每个最后一个双引号 "

之间包含的所有文本作为单独的组

如您所见,文本中有换行符,以及随后的转义双引号 "" 这是我需要 select.[=16= 的文本的一部分]

我想到了这样的东西

(?s)(?!")[^\s](.+?)(?=")

但是多个双引号破坏了我想要的匹配

我是正则表达式的真正新手,所以我想我可能遗漏了一些非常基本的东西。不知道是否相关,但我使用的是 Sublime Text 3,所以我认为应该是 python。

我该怎么做才能达到我的需要?

您可以使用以下正则表达式:

"[^"]*(?:""[^"]*)*"

demo

此正则表达式将匹配非引号或双引号内的 2 个后续双引号。

它是如何工作的?让我分享一张来自 debuggex.com 的图片:

使用正则表达式,我们匹配:

  • " - (1) - 文字引用
  • [^"]* - (2, 3) - 除引号外的0个或多个字符(是的,包括换行符,这是一个negated character class),如果有none ,然后正则表达式搜索最终的文字引号 (6)
  • (?:""[^"]*)* - (4,5) - 0 个或多个序列:
    • "" - (4) - 双双引号
    • [^"]* - (5) - 引号以外的 0 个或多个字符
  • " - (6) - 最后的文字引用。

这比 "(?:[^"]|"")*" 工作得更快(尽管产生相同的结果),因为前者的处理是线性的,涉及的回溯要少得多。

如果您使用 , then you do not need , you can directly use the standard csv library,则单行内的双引号将自动处理。示例(对于您在 a.csv 中发布的 csv)-

>>> import csv
>>> with open('a.csv','r') as f:
...     reader = csv.reader(f)
...     for row in reader:
...             print(row)
...
['Lorem ipsum dolor sit amet, \n consectetur adipisicing elit, sed do eiusmod\n tempor incididunt ut labore et dolore magna \n aliqua. Ut "enim ad" minim veniam,\n quis nostrud exercitation ullamco laboris nisi \n ut aliquip ex ea commodo\n consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n cillum dolore eu fugiat "nulla pariatu"']
['ex ea commodo\n consequat. Duis aute irure "dolor in" reprehenderit \n in voluptate velit esse\n cillum dolore eu fugiat nulla pariatur. \n Excepteur sint occaecat cupidatat non\n proident, sunt in culpa qui officia deserunt \n mollit anim id est laborum.']

这是由 csv 模块正确处理的,主要是因为 " 是默认的 quotechar ,所以两个 " 内的任何内容都被视为该单列的一部分,即使其 \n 或空格等

此外,csv 模块还有另一个名为 doublequote 的参数,即 -

Controls how instances of quotechar appearing inside a field should be themselves be quoted. When True, the character is doubled. When False, the escapechar is used as a prefix to the quotechar. It defaults to True.