包含多个双引号的CSV拆分正则表达式

2024-09-28 21:25:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含文本的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."

上面表示两个后续行。在

{{1>在第一行和第二行之间选择一个分隔的文本{cd1>

如您所见,文本中有换行符,以及随后的转义双引号"",它们是我需要选择的文本的一部分。在

我想出了这样的办法

^{pr2}$

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

我是一个真正的regex新手,所以我想我可能遗漏了一些非常基本的东西。不知道如果相关,但我使用崇高的文本3,所以应该是python我认为。在

我能做些什么来达到我所需要的?在


Tags: in文本exuteadolor双引号dolore
2条回答

如果使用的是,那么就不需要,可以直接使用标准的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模块还有另一个名为^{}的参数-

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.

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

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

demo

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

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

enter image description here

对于regex,我们匹配:

  • "-(1)-字面意思的引用
  • [^"]*-(2,3)-0个或多个引号以外的字符(是的,包括换行符,这是一个negated character class),如果没有,则regex将搜索最后的文本引号(6)
  • (?:""[^"]*)*-(4,5)-0或更多序列:
    • ""-(4)-双双引号
    • [^"]*-(5)-0个或多个字符,而不是引号
  • "-(6)-最后的字面引号。在

这比^{}更快(尽管产生相同的结果),因为前者的处理是线性的,涉及更少的回溯。在

相关问题 更多 >