Python正则匹配重复组问题:提取countries.txt中的国家与首都信息
解决Python正则提取countries.txt中国家与首都的问题
嘿,我来帮你搞定这个正则提取的问题!先从明确场景入手——我先模拟下你countries.txt里的典型内容(符合你说的最多20个属性、示例保留Country和CapitalCity的情况):
Country: Canada
CapitalCity: OttawaCountry: Germany
CapitalCity: BerlinCountry: 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,大概率是这两个原因:
- 没有开启多行模式或DOTALL模式,导致正则无法跨行匹配
- 用了贪婪匹配(比如
.*而非.*?),导致Country的捕获组把后续内容也吞进去了 - 没有正确设置条目边界,导致匹配结果混乱
内容的提问来源于stack exchange,提问作者Telewa
相关产品推荐
相关产品推荐

