【问题标题】:Extracting string between quotes split across multiple lines in Python在Python中跨多行的引号之间提取字符串
【发布时间】:2013-08-31 22:31:32
【问题描述】:

我有一个包含多个条目的文件。每个条目的格式如下:

"field1","field2","field3","field4","field5"

所有字段都保证不包含任何引号,但它们可以包含,。问题是field4 可以分成多行。因此示例文件可能如下所示:

"john","male US","done","Some sample text
across multiple lines. There
can be many lines of this","foo bar baz"
"jane","female UK","done","fields can have , in them","abc xyz"

我想使用 Python 提取字段。如果该字段不会被拆分为多行,这将很简单:Extract string from between quotations。但是在存在多行字段的情况下,我似乎找不到一种简单的方法来做到这一点。

编辑:实际上有五个字段。抱歉,如果有任何混淆。该问题已被编辑以反映这一点。

【问题讨论】:

  • 链接问题的答案应该可以正常工作。你试过了吗?
  • 是的。我像for line in file: regex.findall(...) 一样使用它。问题发生是因为它是一行一行的。
  • 将所有"\n" 替换为"" 还是需要保留它们?
  • 但这会将所有字段融合在一起。
  • 文件大吗?你能把它全部读入记忆吗?

标签: python regex string


【解决方案1】:

我认为csv 模块可以解决这个问题。它用换行符正确分割:

import csv 

f = open('infile', newline='')
reader = csv.reader(f)
for row in reader:
    for field in row:
        print('-- {}'.format(field))

它产生:

-- john
-- male US
-- done
-- Some sample text
across multiple lines. There
can be many lines of this
-- foo bar baz
-- jane
-- female UK
-- done
-- fields can have , in them
-- abc xyz

【讨论】:

  • 我想过json,但它不喜欢\n的值。
  • 如果没有opennewline 参数,这个解决方案可能已经足够好了,它可以直接在Python 2 中工作。我理解你为什么使用它,只是觉得它值得注意。
【解决方案2】:

您链接的问题的答案对我有用:

import re
f = open("test.txt")
text = f.read()

string_list = re.findall('"([^"]*"', text)

此时,string_list 包含您的字符串。现在,这些字符串中可以有换行符,但你可以使用

new_string = string_list.replace("\n", " ")

清理它。

【讨论】:

  • alecxe:当然可以,在这种情况下,可能需要做一些更复杂的事情,比如分块读取文件并解析它们。
【解决方案3】:

试试:

awk '{FS=','} /pattern if needed/{print $0}' fname

【讨论】:

  • 您的意思是使用 RS 代替 OFS 吗?即使那样这也不起作用,因为字段本身可以有,,并且字段是多行的。 awk 只逐行读取文件。
【解决方案4】:

如果您控制此文件的输入,则需要先将 \n 替换为 ([\n]?) 来对其进行清理,然后再将这些值放入逗号分隔的列表中。

或者,不是保存字符串 -- 将它们保存为 r-strings。

然后,使用csv 模块使用预定义的分隔符、编码和引号字符快速解析它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多