python - 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)
解决方案
对于一个正则表达式,您应该使用^<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))
推荐阅读
- python - 如何解决错误“-:'int'和'tuple'不支持的操作数类型”
- assembly - ld 与 -Ttext=0x1000 使文件非常大
- c++ - 误报“clang-analyzer-core.uninitialized.*”或使用“std::valarray”的隐藏威胁?
- c++ - 错误条件后的标准输入状态
- python - 将字符串中的字母临时索引到不同的二进制文件
- android - 发送通知前检查当前接收者状态
- javascript - 使用 AJAX 调用表
- javascript - 如何在rest api中传递查询参数?
- firebase-realtime-database - 是否可以让 Firebase 实时数据库节点仅可供 2 个特定用户访问?
- mongodb - 减少数组元素 (MongoDB)