如何从含逗号与引号的字符串中提取地名?求更优实现方案
更优雅地提取带引号包裹的地名列表
问题场景
给定如下格式的地名字符串:
locations = 'Los Angeles California ,"Heliopolis, Central, Cairo, Egypt",Berlin Germany, Paris France," Cairo, Egypt " , "Dokki, Giza, Egypt " , Singapore'
规则说明:
- 地名整体以逗号分隔
- 内部包含逗号的地名被
"(转义双引号)包裹 - 所有提取出的地名需要去除前后空格
预期提取结果:
['Los Angeles California', 'Heliopolis, Central, Cairo, Egypt', 'Berlin Germany', 'Paris France', 'Cairo, Egypt', 'Dokki, Giza, Egypt', 'Singapore']
现有实现方案较为繁琐,以下提供两种更简洁的优化方案:
方案一:使用正则表达式一次性匹配
利用正则匹配两种模式:引号包裹的内容、非引号内的非逗号片段,再统一处理空格。
import re locations = 'Los Angeles California ,"Heliopolis, Central, Cairo, Egypt",Berlin Germany, Paris France," Cairo, Egypt " , "Dokki, Giza, Egypt " , Singapore' # 匹配规则:要么是引号内的内容,要么是逗号分隔的非引号片段 matches = re.findall(r'"(.*?)"|([^,]+)', locations) # 提取有效内容并去除前后空格 result = [item.strip() for match in matches for item in match if item.strip()] print(result)
正则说明
"(.*?)":匹配被转义双引号包裹的内容,.*?是非贪婪匹配,避免跨引号匹配([^,]+):匹配不在引号内的、以逗号为分隔符的片段- 遍历匹配结果时,过滤掉空字符串,再对每个有效内容执行
strip()去除前后空格
方案二:利用csv模块解析(更推荐)
csv模块原生支持处理带引号的字段,能自动识别引号内的逗号为内容而非分隔符,代码更直观不易出错。
import csv from io import StringIO locations = 'Los Angeles California ,"Heliopolis, Central, Cairo, Egypt",Berlin Germany, Paris France," Cairo, Egypt " , "Dokki, Giza, Egypt " , Singapore' # 把转义双引号替换为实际双引号 csv_content = locations.replace('"', '"') # 用csv读取器解析,skipinitialspace=True跳过字段前的空格 with StringIO(csv_content) as f: reader = csv.reader(f, skipinitialspace=True) # 读取第一行(整个字符串是一行csv)并处理每个元素的前后空格 result = [item.strip() for item in next(reader)] print(result)
优势
- 无需自己编写复杂正则,依赖csv模块的成熟逻辑处理字段分隔
- 天然支持各种带引号的字段场景,扩展性更强
内容的提问来源于stack exchange,提问作者blackraven
相关产品推荐
相关产品推荐

