Python 正则表达式:如何使用正则表达式读取包含多行的文件,并从每行中提取单词以创建两个不同的列表



>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)

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

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

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

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

import re
regex = "^<tds*>([a-zA-Z]+)</tds*>.*<tds*>([a-zA-Z]+)</tds*>.*"
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))

您可以使用此正则表达式来提取国家/地区。<s*(td)[^>]*>(w*)<s*/s*(td)>这是选择标签,其中标签中的文本是单词(即不是数字(

这将返回元组列表[('td', 'England', 'td'), ('td', 'Japan', 'td')]

然后,我映射并选择元组中的第二个元素,即国家/地区。

regex = '<s*(td)[^>]*>(w*)<s*/s*(td)>'
countries = list(map(lambda x: x[1], re.findall(regex, line)))
print(countries)  # ['England', 'Japan']

需要注意的一件事是,您需要使用line而不是循环中的infile

所以把它放在一起:

regex = '<s*(td)[^>]*>(w*)<s*/s*(td)>'
european_countries = []
asian_countries = []
for line in infile:
countries = list(map(lambda x: x[1], re.findall(regex, line)))
european_countries.append(countries[0])
asian_countries.append(countries[1])

请注意,如果您有其他带有文本的<td>标签,这将不起作用。此外,国家/地区的顺序对于此代码也很重要。但是快速解决您的问题。

f = open('country_names.txt', 'r')
line = f.readlines()
e_countries = []
a_countries = []
for i in line:
line1 = i.split(', ')[0]
line2 = i.split(', ')[1]
e_countries.append(line1)
a_countries.append(line2)

最新更新