You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则匹配重复组问题:提取countries.txt中的国家与首都信息

解决Python正则提取countries.txt中国家与首都的问题

嘿,我来帮你搞定这个正则提取的问题!先从明确场景入手——我先模拟下你countries.txt里的典型内容(符合你说的最多20个属性、示例保留Country和CapitalCity的情况):

Country: Canada
CapitalCity: Ottawa

Country: Germany
CapitalCity: Berlin

Country: Australia
CapitalCity: Canberra

核心正则表达式与Python实现

你之前遇到的问题大概率是没处理好多行分隔、非贪婪匹配或者边界判断。这里给你一个精准适配的方案:

import re

# 读取文件内容
with open('countries.txt', 'r', encoding='utf-8') as file:
    file_content = file.read()

# 定义匹配规则:捕获Country和CapitalCity对应的值,适配条目间的空行分隔
country_pattern = re.compile(
    r'Country:\s*(.*?)\s*\nCapitalCity:\s*(.*?)(?=\n\n|\Z)',
    re.DOTALL
)

# 提取所有匹配的国家-首都对
results = country_pattern.findall(file_content)

# 输出处理后的结果
for country, capital in results:
    # 用strip()去掉可能的前后空白
    print(f"国家:{country.strip()},首都:{capital.strip()}")

正则规则详解

让我拆解下这个正则的逻辑,方便你根据实际内容调整:

  • Country:\s*:匹配"Country:"标签,\s*吃掉标签后面的任意空白(空格、制表符都能覆盖)
  • (.*?):非贪婪捕获国家名称,直到遇到换行符(避免匹配到多余内容)
  • \s*\n:匹配换行前的空白和换行本身,衔接下一行的CapitalCity标签
  • CapitalCity:\s*:和Country的逻辑一致,匹配标签和后续空白
  • (.*?):捕获首都名称
  • (?=\n\n|\Z):正向预查,匹配到两个连续换行(条目分隔符)或文本结尾,确保每个条目被正确分割

适配特殊场景的调整

如果你的文件里存在属性顺序变化(比如CapitalCity在Country前面)、中间夹杂其他属性,或者标签大小写不统一,可以用这个更灵活的版本:

# 适配任意属性顺序、中间含其他属性、标签大小写不敏感的规则
flexible_pattern = re.compile(
    r'(?i)Country:\s*(.*?)(?=\s*\n|$).*?CapitalCity:\s*(.*?)(?=\n\n|\Z)',
    re.DOTALL
)
  • (?i):开启大小写不敏感匹配,能匹配"country:""COUNTRY:"等各种格式
  • .*?:非贪婪匹配中间的任意内容(比如其他属性行),确保跳过无关内容只捕获目标属性

为什么之前的尝试没成功?

你提到的regex101例子没提取到Country,大概率是这两个原因:

  1. 没有开启多行模式或DOTALL模式,导致正则无法跨行匹配
  2. 用了贪婪匹配(比如.*而非.*?),导致Country的捕获组把后续内容也吞进去了
  3. 没有正确设置条目边界,导致匹配结果混乱

内容的提问来源于stack exchange,提问作者Telewa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:03:14