我想从预定义国家/地区列表中识别出现在文本中的国家/地区。 问题是,有些名称非常相似,因此如果文本中有一个国家,它也会识别另一个国家。 例如:
text1 = "The disease has spread to three countries: Guinea, Guinea-Bassau and Equatorial Guinea."
text2 = "Only Guinea-Bassau and Equatorial Guinea contained strains of the virus."
list_of_countries = ['Guinea', 'Guinea-Bassau', 'Equatorial Guinea']
我仍然没有找到可以返回text1的所有三个列表项的代码,但是只能返回text2的“ Guinea-Bassau”和“赤道几内亚”的代码。
这只是一个具体示例。当然,我可以为非洲三个包含几内亚的国家的具体问题创建一个临时解决方案,但是后来问题又回到了“刚果共和国”和“刚果民主共和国”等。>
编辑:我想到一种解决此问题的方法是,一旦与实例中最长的国家/地区匹配,就删除/丢弃文本中的任何实例。
答案 0 :(得分:1)
您可以使用
import re
text1 = "The disease has spread to three countries: Guinea, Guinea-Bassau and Equatorial Guinea."
text2 = "Only Guinea-Bassau and Equatorial Guinea contained strains of the virus."
list_of_countries = ['Guinea', 'Guinea-Bassau', 'Equatorial Guinea']
# Sort the list by length in descending order
list_of_countries=sorted(list_of_countries,key=len,reverse=True)
# Build the alternation based regex with \b to match each item as a whole word
rx=r'\b(?:{})\b'.format("|".join(list_of_countries))
print(re.findall(rx, text1))
# => ['Guinea', 'Guinea-Bassau', 'Equatorial Guinea']
print(re.findall(rx, text2))
# => ['Guinea-Bassau', 'Equatorial Guinea']
请参见Python demo
请注意,list_of_countries
列表按长度降序排序很重要,因为列表中的项目可能具有空格,并且可能在字符串中的同一位置开始。
形成的正则表达式是
\b(?:Equatorial Guinea|Guinea-Bassau|Guinea)\b
请参见regex demo
详细信息
\b
-单词边界(?:
-一个非捕获组的开始,以便可以将单词边界应用于每个交替词
Equatorial Guinea
|
-或Guinea-Bassau
|
-或Guinea
)
-组结束\b
-单词边界。