使用正则表达式搜索国家/地区名称的文本,包括空格和不包含空格

时间:2017-02-27 12:22:35

标签: python regex

我使用正则表达式搜索文本块以查找文本中的所有国家/地区名称。但是国名可以包含空格,例如英国可以是英国,英国,英国或国家。

到目前为止,我一直遵循的过程是:

1)首先删除所有不以大写字母开头的单词。

2)然后搜索此

之前的所有小写字母

我为此创建了一个基本表达式;

[A-Z][a-z]+

这适用于一个单词的国家/地区。

但是,我希望能够捕获包含多个单词的国家/地区名称。然后我使用管道操作符来匹配多个组(|)

现在是这个过程;

1)通过使正则表达式只搜索以第一个字母的大写字母开头的单词来消除所有小写单词。(与之前相同)

2)使用管道运算符匹配多个组;

2.1)组1将用于匹配第一个大写字母前面的一个或多个小写字母。 (即所以我将能够得到国家名称“中国”)

2.2)其中第2组将用于匹配第一个大写字母前面的一个或多个大写字母。 (即我将能够获得国家名称“USA”)

2.3)第3组将用于匹配多个单词和空格,其中单词可以有大写字母,(即我可以得到国家名称“巴布亚新几内亚”)

我已经设法使用正则表达式实现了前两组(2.1和2.2);

[A-Z]([a-z]+|[A-Z]+)

然而,当尝试实现第三组时,我无法使用管道运算符获得结果,因为管道运算符与第一组匹配(2.1)。

我用于此的正则表达式是;

[A-Z]([a-z]+|[A-Z]+|[a-zA-Z\s]*)

有没有办法检查正则表达式是否匹配所有组?

这是我的正则表达式的link

2 个答案:

答案 0 :(得分:1)

编辑:我在OP完全改变了他们的问题之前发布了以下答案。

您可以使用正则表达式二进制OR运算符(由|表示)来搜索其中一个国家/地区名称,并使用括号运算符将匹配项置于"组":

(.*(China|United Kingdom|England).*)*

内部.*捕获国家/地区名称周围或之间的任何文字。外部*将重复群组匹配,直到所有国家/地区名称都匹配为止。

例如,在page you linked to上,您只会引用绿色匹配("组"匹配),而不是完整匹配。

我建议以编程方式执行此操作。您将遍历国家/地区名称列表并在输入字符串中搜索它们:

简化的Python示例:

all_country_names = ['China', 'United Kingdom', 'England']
found_country_names = []
input = 'In China there is the great wall.'
for name in all_country_names:
    if name in input:
        found_country_names.append(name)

答案 1 :(得分:0)

根据comment回答。

假设您有所有国家/地区的列表:

countries = ['Russia', 'USA', 'United States of America', 'Zimbabwe']
# this should contain all the countries, I just show an example here

然后你可以这样做:

indexes = [text.find(country) for country in countries]
found_contries = [(index, country) for index, country in zip(indexes, countries) 
                  if index != -1]

因此,我们为文本中实际找到的国家/地区制作了一个元组(index, country)列表(如果找不到,text.find返回-1,并根据条件{{从列表中排除它1}})。

然后你需要的国家就是

if index != -1

例如,让min(found_contries)[1] 。然后

text = "lala lalala Zimbabwe lala USA"