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

正则匹配单词首尾单双引号 移除多余引号的问题求助

问题说明

需求如下:

  • 查找、统计所有被单引号或双引号成对包裹的单词/词组
  • 识别所有不成对的多余引号,用于后续移除
    现有正则存在误匹配问题:当待匹配字符串以单个双引号开头、以两个双引号结尾时,正则依然会返回匹配结果,不符合预期。
    测试代码如下:
import re
f = '"country id""   "state id"'
print(re.findall('^".*["\s"][a-z].*"$',f))
问题原因

原有正则使用了.*贪婪匹配规则,会从字符串开头第一个双引号开始,尽可能匹配最长的符合规则的字符,直接吞掉中间所有内容直到字符串末尾最后一个双引号,完全不会校验中间的引号是否成对,自然会把多余的引号也算进匹配结果里。

解决方案

使用反向引用+排除字符类的正则,既可以准确匹配同类型引号成对包裹的内容,也能定位所有不成对的多余引号:

  1. 正则核心逻辑:用捕获组匹配左引号(单/双引号),中间匹配不包含同类型引号的内容,最后用反向引用匹配和左引号完全一致的右引号,从规则上避免跨引号、错配引号的问题
  2. 记录所有合法成对引号的位置,不在合法位置上的引号就是需要移除的多余引号

可直接运行的代码示例:

import re

f = '"country id""   \'city name\'  "state id"'
# 匹配成对单/双引号包裹的内容
# 正则拆解:
# (['"]) 捕获左引号,支持单引号、双引号
# ([^'"]+) 匹配引号内内容,不允许出现同类型引号,避免跨引号匹配
# \1 匹配和左引号完全相同的右引号,保证引号配对
pair_pattern = re.compile(r'(['"])([^'"]+)\1')

# 提取所有成对包裹的词组
valid_phrases = [match.group(2).strip() for match in pair_pattern.finditer(f)]
print("成对包裹的词组:", valid_phrases)

# 标记所有合法引号的位置,不在集合内的引号就是多余引号
valid_quote_index = set()
for match in pair_pattern.finditer(f):
    valid_quote_index.add(match.start(1)) # 左引号位置
    valid_quote_index.add(match.end(1)-1) # 右引号位置

# 拼接移除多余引号后的字符串
clean_result = ''.join(
    [char for idx, char in enumerate(f) if not (char in ('"', "'") and idx not in valid_quote_index)]
)
print("移除多余引号后的结果:", clean_result)

针对给出的测试字符串'"country id"" "state id"',运行后输出结果为:

成对包裹的词组: ['country id', 'state id']
移除多余引号后的结果: "country id"   "state id"

中间多余的双引号会被准确识别并移除,完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:06:26