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

时间:2015-08-31 06:31:06

标签: python regex csv sublimetext3 double-quotes

我有一个包含文字的CSV列数据。每行用双引号%Logistic model in its discrete form. r=2.5; y = zeros(100, 1); y(1) = rand(1); for j=1:100 y(j+1)=r*y(j)*(1-y(j)); end j = 1:length(y); plot(j, y, '.') print("MyPNG.png", "-dpng")

分隔

连续示例文本与此类似(通知:新行和每行之前的空格

"

以上代表2个后续行。

我想选择每个第一个双引号"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." (起始行)和每个最后双引号"

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

正如你所看到的那样,文本中有换行符,以及后续的双引号",它是我需要选择的文本的一部分。

我想出了类似的东西

""

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

我是正则表达式的真正新手,所以我想也许我错过了一些非常基本的东西。 Dunno如果相关,但我使用Sublime Text 3,所以应该是python我认为。

我能做些什么来实现我的需要?

2 个答案:

答案 0 :(得分:4)

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

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

请参阅demo

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

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

enter image description here

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

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

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

答案 1 :(得分:3)

如果您使用的是,那么您不需要,您可以直接使用标准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的参数 -

  

控制如何引用字段中出现的quotechar实例。 当为True时,角色加倍。如果为False,则escapechar将用作quotechar的前缀。它默认为True。