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

如何从含逗号与引号的字符串中提取地名?求更优实现方案

更优雅地提取带引号包裹的地名列表

问题场景

给定如下格式的地名字符串:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:39:15