【问题标题】:How to extract country from a string in python如何从python中的字符串中提取国家
【发布时间】:2021-05-31 04:57:34
【问题描述】:

我有一些文本,其中可能包含也可能不包含国家名称。例如:

'尼日利亚:Hotspot Network LTD 农村电话可行性研究'

这就是我从中提取国家名称的方式。在我的第一次尝试中:

findcountry("Nigeria: Hotspot Network LTD Rural Telephony Feasibility Study")

def findCountry(stringText):
    for country in pycountry.countries:
        if country.name.lower() in stringText.lower():
            return country.name
    return None

不幸的是,它给了我错误的输出[Niger],而正确的输出是尼日利亚。注意尼日尔和尼日利亚是世界上两个不同的现有国家。

第二次尝试:

def findCountry(stringText):
    full_list =[]
    for country in pycountry.countries:
        if country.name.lower() in stringText.lower():
            full_list.append(country)

    if len(full_list) > 0:
        return full_list

    return None

我得到['Niger', 'Nigeria'] 作为输出。但我找不到让尼日利亚成为我最终输出的方法。如何做到这一点。

注意:这里我知道尼日利亚是正确的答案,但稍后我会将其放入代码中以选择文本中存在的最终国家/地区名称,并且它应该具有非常高的检测准确度。

【问题讨论】:

  • stackoverflow.com/questions/48607339/… 我想这就是你要找的东西。
  • 按国家名称的长度降序排列。
  • @Tangent 我使用的是同一个库,但有步骤。正如我已经提到的,我需要正确的单一答案,我得到错误的答案

标签: python


【解决方案1】:

总是先搜索最长的字符串;这将防止您遇到的那种错误。

countries = sorted(pycountry.countries, key=lambda x: -len(x))

【讨论】:

  • @Aamdan 对不起,我不明白在哪里以及如何使用此代码。能不能给个提示
  • 你正在迭代pycountry.countries,它没有排序;遍历这些排序的countries 应该会给你正确的答案。
【解决方案2】:

一种正则表达式方法是构建一个包含所有要找到的目标国家/地区的替代方案。然后,在输入文本上使用re.findall 来查找任何可能的匹配项:

regex = r'\b(?:' + '|'.join(pycountry.countries) + r')\b'

def findCountry(stringText):
    countries = re.findall(regex, stringText, flags=re.IGNORECASE)
    return countries

【讨论】:

  • 它返回给我一个空列表,运行程序需要做一些小改动。在 join 方法中,我们应该在 pycountry.countries 中为国家写 country.name,因为它需要文本而不是 Country 对象。在最终版本中,当我在 findall 中传递我的字符串时,它返回空列表而不是尼日利亚
  • @TalibDaryabi 检查更新的答案并尝试在不区分大小写的模式下运行正则表达式搜索。
  • 它仍然返回一个空列表。我运行这样的代码: regex = r'\b(?:' + '|'.join(country.name.lower() for country in pycountry.countries) + ')\b' countries = re.findall(正则表达式、标题、标志=re.IGNORECASE)
  • 标题是尼日利亚在其中的激动人心
  • 大声笑我显然没有阅读理解能力:D 对不起...
【解决方案3】:

这里的问题正在发生。所以尼日尔对尼日利亚来说是正确的。您还可以在 in 之前和之后更改变量的位置,但这将解决尼日利亚的问题,但不适用于其他人。您可以使用== 解决所有问题。

def findCountry(stringText):
    for country in pycountry.countries:
        if country.name.lower() == stringText.lower():
            return country.name
    return None

【讨论】:

  • 谢谢你,我需要的答案也应该适用于所有其他条件
  • 不客气@TalibDaryabi。让我知道它是否能解决您的问题?
【解决方案4】:

我得到了这样的正确答案:

def findCountry(stringText):
    countries = sorted([country.name for country in pycountry.countries] , key=lambda x: -len(x))
    for country in countries:
        if country.lower() in stringText.lower():
            return country
    return None

在这个问题中遵循@Amdan 解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 2018-06-08
    • 1970-01-01
    • 2018-07-14
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多