首页 > 解决方案 > Python Regex:如何使用正则表达式读取多行文件,并从每行中提取单词以创建两个不同的列表

问题描述

country_names.txt 是一个多行文件,每行包含一个欧洲国家和一个亚洲国家。阅读每一行文本,直到有一行带有国家名称。

文本文件中的示例行: <td >England</td> <td>55.98</td> <td >Japan</td> <td>126.8</td></tr>

如何只使用一个正则表达式从包含两个国家的任何行中提取一个欧洲国家和一个亚洲国家。提取国家后,将欧洲国家存储在欧洲国家名称列表中,将亚洲国家存储在亚洲国家名称列表中。

读完所有行后,打印已读入的欧洲国家和亚洲国家的数量。

目前,这就是我所拥有的:

import re

with open('country_names.txt') as infile:

for line in infile:

        countries = re.findall("", "", infile) # regex code inside ""s in parenthesis

european_countries = countries.group(1)

asian_countries = countries.group(2)

标签: pythonregexpython-3.x

解决方案


对于一个正则表达式,您应该使用^<td\s*>([a-zA-Z]+)<\/td\s*>.*<td\s*>([a-zA-Z]+)<\/td\s*>. 你可以在这里玩:https ://regex101.com/r/q9XHDD/1

在您的示例上运行它时,您将获得:

>>> re.findall("^<td\s*>([a-zA-Z]+)<\/td\s*>.*<td\s*>([a-zA-Z]+)<\/td\s*>.*", "<td >England</td> <td>55.98</td> <td >Japan</td> <td>126.8</td></tr>")
[('England', 'Japan')]

我对你的建议不是使用re.findall而是使用re.match然后你的代码应该是

import re

regex = "^<td\s*>([a-zA-Z]+)<\/td\s*>.*<td\s*>([a-zA-Z]+)<\/td\s*>.*"
eu_countries = []
as_countries = []
with open('country_names.txt') as infile:
   for line in infile:
        match = re.match(regex, line )
        if match:
            eu_countries.append(match.group(1))
            as_countries.append(match.group(2))

推荐阅读