【问题标题】:Parsing a unique string?解析一个唯一的字符串?
【发布时间】:2020-06-06 14:13:15
【问题描述】:

我对 python 很陌生,但我需要一些帮助来解析具有独特结构的字符串。我有一个 CSV 文件,其中有一列结构如下:

[Chakroff, Alek; Young, Liane] Boston Coll, Chestnut Hill, MA 02167 USA; [Russell, Pascale Sophie] Univ Surrey, Guildford, Surrey, England; [Piazza, Jared] Univ Lancaster, Lancaster, England

我只想在分号之前提取国家名称。因此,对于上述内容,我想要“美国、英格兰、英格兰”。字符串的整体结构是:

[last name, first name], university, address, zip code, country; 

如何仅获取具有此字符串布局的国家/地区?有没有办法指定我想要分号之前的国家名称?或者更简单的方法来提取我需要的信息?

请对我放轻松,无论如何我都不是最好的程序员:)

【问题讨论】:

  • 这部分是什么意思?阿列克;年轻的
  • 所以这是我拥有的一个很长的唯一字符串。因此,括号中的人名是按姓氏和名字排列的。然后在括号之外我有大学名称,大学地址,邮政编码和国家。然后是一个分号,然后是另一个名称的括号等。它遵循相同的格式。这有帮助吗?

标签: python arrays string parsing


【解决方案1】:

您可以在想要的元素之前利用唯一的子字符串:

# split string on substring '; ['
for i in s.split('; ['):
    # split each resulting string on space char, return last element of array
    print(i.split()[-1])

USA
England
England

【讨论】:

  • 这太不可思议了,非常感谢您的回答,我会试试看!
  • 如果感兴趣的字符串不以分号结尾怎么办。我试图了解您编写的 for 循环如何返回最后一个“英格兰”
  • @eruiz:split返回的最后一段是最后一个分隔符之后的部分,以England结尾。 (如果字符串以; 结尾,您将得到England;,因此请注意末尾的空白字段。)此解决方案的真正问题是当国家/地区类似于New Zealand 时会发生什么。但是我不知道在不知道可能的国家的情况下如何解决这个问题,因为国家名称之前没有有用的分隔符。
  • @rici 知道如何使用遵循这种格式的字符串数据帧来做到这一点吗?它适用于我称为 s 的一个字符串,但我有一整列包含 2663 行的字符串。谢谢
【解决方案2】:

你可以对字符串使用 split() 方法

states = [person_record.split(",")[-1] for person_record in records.split("; [")]

其中 records 是您从输入中获得的字符串。

【讨论】:

  • 这不起作用,因为分号表示一个组中的多个人,除了分隔感兴趣的元素。
  • 正确,我没有注意到额外的分号,谢谢!
【解决方案3】:

使用正则表达式:

import regex as re

data = "[Chakroff, Alek; Young, Liane] Boston Coll, Chestnut Hill, MA 02167 USA; [Russell, Pascale Sophie] Univ Surrey, Guildford, Surrey, England; [Piazza, Jared] Univ Lancaster, Lancaster, England"
outer_pattern = re.compile(r'\[[^][]+\](*SKIP)(*FAIL)|;')
inner_pattern = re.compile(r'(\w+)\s*$')

countries = [country.group(1)
             for chunk in outer_pattern.split(data)
             for country in [inner_pattern.search(chunk)]
             if country]

print(countries)
# ['USA', 'England', 'England']

【讨论】:

  • 它不允许我导入正则表达式?我不断收到版本错误或类似的东西。有谁知道这个问题吗?
猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多