从带引号的字符串中提取键值对

2024-03-03

我在为这一要求编写“优雅”解析器时遇到困难。 (看起来不像是一份C早餐)。输入是一个字符串,键值对以“,”分隔并连接“=”。

key1=value1,key2=value2

欺骗我的部分是值可以用引号引起来 (") ,并且引号内的 ',' 不会结束键。

key1=value1,key2="value2,still_value2"

最后一部分使我很难使用 split 或 re.split,而是求助于 for i in range for 循环:(。

谁能展示一种干净的方法来做到这一点?

可以假设引号仅出现在值中,并且没有空格或非字母数字字符。


我建议不要使用正则表达式来完成此任务,因为您要解析的语言不是正则的。

您有一个由多个键值对组成的字符串。解析它的最佳方法不是匹配它的模式,而是正确地标记它。

Python标准库中有一个模块,叫做shlex,它模仿 POSIX shell 完成的解析,并提供可以轻松根据您的需求进行自定义的词法分析器实现。

from shlex import shlex

def parse_kv_pairs(text, item_sep=",", value_sep="="):
    """Parse key-value pairs from a shell-like text."""
    # initialize a lexer, in POSIX mode (to properly handle escaping)
    lexer = shlex(text, posix=True)
    # set ',' as whitespace for the lexer
    # (the lexer will use this character to separate words)
    lexer.whitespace = item_sep
    # include '=' as a word character 
    # (this is done so that the lexer returns a list of key-value pairs)
    # (if your option key or value contains any unquoted special character, you will need to add it here)
    lexer.wordchars += value_sep
    # then we separate option keys and values to build the resulting dictionary
    # (maxsplit is required to make sure that '=' in value will not be a problem)
    return dict(word.split(value_sep, maxsplit=1) for word in lexer)

(split has a maxsplit论证,使用起来比分割/切片/连接 https://stackoverflow.com/revisions/38738997/2.)

运行示例:

parse_kv_pairs(
  'key1=value1,key2=\'value2,still_value2,not_key1="not_value1"\''
)

Output:

{'key1': 'value1', 'key2': 'value2,still_value2,not_key1="not_value1"'}

我通常坚持使用 shlex 而不是使用正则表达式(在这种情况下更快)的原因是它给您带来的惊喜更少,特别是如果您稍后需要允许更多可能的输入。我从未找到如何使用正则表达式正确解析此类键值对,总会有输入(例如A="B=\"1,2,3\"")这会欺骗引擎。

如果您不关心此类输入(或者,换句话说,如果您可以确保您的输入遵循正则语言的定义),那么正则表达式就完全没问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从带引号的字符串中提取键值对 的相关文章

  • 从Python中的字符串中提取货币金额

    我正在制作一个程序 从字符串中获取货币并将其转换为其他货币 例如 如果字符串是 the car cost me 13 250 我需要得到 and 13250 我已经有了这个正则表达式 1 确实如此 但是该字符串很有可能有多个价格 并且全部使
  • boto3 资源(例如 DynamoDB.Table)的类型注释

    The boto3库提供了几种返回资源的工厂方法 例如 dynamo boto3 resource dynamodb Table os environ DYNAMODB TABLE 我想注释这些资源 以便我可以获得更好的类型检查和完成 但我
  • 如何使用显式引用转储 YAML?

    递归引用非常适合ruamel yaml or pyyaml ruamel yaml dump ruamel yaml load A A id001 id001 然而 它 显然 不适用于普通引用 ruamel yaml dump ruamel
  • 为什么我的代码不能根据字典解码加密字符串?

    我有一本字典 其中包含代表字母的键和值 例如一个简单的 DICT CODE b g n a p o x d t y 我收到了一个加密代码 并将该字符串转换为一个列表 其中每个项目都是一个单词 我需要根据字典中的项目来解决它 代码示例是 wo
  • TF map_fn 或 while_loop 用于不同形状的张量列表

    我想处理不同形状的张量序列 列表 并输出另一个张量列表 考虑每个时间戳上具有不同隐藏状态大小的 RNN 就像是 输入 tf ones 1 2 2 tf ones 2 2 3 tf ones 3 2 1 输出 tf zeros 1 2 4 t
  • 查找模块中显式定义的函数 (python)

    好的 我知道您可以使用 dir 方法列出模块中的所有内容 但是有什么方法可以仅查看该模块中定义的函数吗 例如 假设我的模块如下所示 from datetime import date datetime def test return Thi
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • 如何在 Python 3 中循环遍历集合,同时从集合中删除项目

    这是我的情况 我有一个list set 哪个并不重要 movieplayer我想调用的对象 preload 功能开启 该预加载函数可以立即返回 但希望将来返回一点 我想存储这个电影播放器 集合 表明它们尚未预加载 然后循环它们 调用prel
  • WindowsError:[错误 126] 使用 ctypes 加载操作系统时

    python代码无法在Windows 7平台上运行 def libSO lib ctypes cdll LoadLibrary ConsoleApplication2 so lib cfoo2 1 3 当我尝试运行它时 得到来自python
  • python 中的 Johansen 协整检验

    我找不到任何有关在处理统计和时间序列分析 pandas 和 statsmodel 的 Python 模块中执行 Johansen 协整检验的功能的参考 有谁知道是否有一些代码可以执行时间序列之间的协整测试 现在 这已在 Python 的 s
  • Pandas 滚动窗口 Spearman 相关性

    我想使用滚动窗口计算 DataFrame 两列之间的 Spearman 和 或 Pearson 相关性 我努力了df corr df col1 rolling P corr df col2 P为窗口尺寸 但我似乎无法定义该方法 添加meth
  • Python 类型安全吗?

    根据维基百科 https en wikipedia org wiki Type system Type safety and memory safety 如果一种语言不允许违反类型系统规则的操作或转换 计算机科学家就认为该语言是 类型安全的
  • 如何从 CSS 选择器中提取类名?

    故事 我目前正在构建一个 ESLint 规则 以警告在 CSS 选择器定位器中使用引导布局导向和角度技术类 目前我在字符串方法中使用简单的子字符串 for var i 0 i lt prohibitedClasses length i if
  • 无法在 python 3.8 上将带有 webapp 的 python 部署到 azure

    我正在尝试使用部署一个测试项目Flask使用以下方法将框架迁移到 Azure 云中Azure CLI https learn microsoft com en us azure app service containers quicksta
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 为什么 smtplib.SMTP().sendmail 不发送 DKIM 签名邮件

    我已经在服务器上设置了 postfix 以及 openDKIM 当我跑步时 echo Testing setup mail s Postfix test my email address 我收到电子邮件 邮件标题中有一个DKIM Signa
  • 如何在 robobrowser-python 中发出 POST 请求

    http robobrowser readthedocs org en latest api html http robobrowser readthedocs org en latest api html 我正在尝试使用 APIbrows
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • python sklearn中的fit方法

    我问自己关于 sklearn 中拟合方法的各种问题 问题1 当我这样做时 from sklearn decomposition import TruncatedSVD model TruncatedSVD svd 1 model fit X
  • 长/宽数据到宽/长

    我有一个数据框 如下所示 import pandas as pd d decil 1 decil 1 decil 2 decil 2 decil 3 decil 3 decil kommune AA BB AA BB AA BB 2010

随机推荐

  • 对部分排序的数组进行排序

    我正在尝试对具有以下属性的数组进行排序 它增加到一定程度然后开始减少 然后增加然后减少等等 是否有任何算法可以通过利用部分排序来以低于 nlog n 的复杂度对其进行排序 数组示例 14 19 34 56 36 22 20 7 45 56
  • Python 求和字典列表中元组中的值?

    在我的字典中 每个条目都有一个元组列表 我的python语法可能是错误的 请耐心等待 它看起来像这样 1 2 2 4 3 6 1 7 1 8 3 2 4 1 5 3 1 2 我想对每个条目的元组中的第二个值求和 即 1 10 2 5 我一直
  • 当 TabHost 存在于活动中时,EditText 使用硬键盘失去焦点

    我正在 tabhost 内显示 EditText Tabhost 位于 SherlockFragmentActivity 内部 假设我处于触摸模式 我单击 EditText 以使其获得焦点并开始在其上输入内容 输入 2 3 个字符后 我决定
  • 将 image/jpeg 作为 arraybuffer 或 blob 返回

    我目前正在调用我的 api 它返回一个图像作为image jpeg 我的问题是通过 javascript Angular 调用 url 时 factory资源 我的数组缓冲区为空 另外 字节长度为 0 如果我使用响应类型 或 文本 调用 a
  • 是否有专为创建 REST API 参考文档而设计的 CMS 引擎? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Scala 并行赋值仅在声明中

    Having def f 1 two 3 0 为什么可以 var x y z f but not var i 0 var j hello var k 0 0 use i j k then i j k f expected but found
  • 用于未来更新的 Android 数据库方法

    在 android 中使用 sqlite 数据库的最佳方法是什么 sqlite数据库文件 第一次复制到应用环境中 OR 在代码中创建表 在数据库助手的 onCreate 中 我的数据库有6个表 第一次是空的 我问这个问题是因为我想将来更新我
  • 在 Lollipop 上使用 Android 存储访问框架列出文件时出现错误

    背景 我有一些应用程序大量使用 SD 卡进行文件同步 Kitkat 上的外部 SD 卡访问损坏仍然是一个大问题 但我正在尝试使用 Lollipop 上提供的新 API 为拥有此问题的用户解决此问题 我成功请求并保留了对 SD 卡的权限 并且
  • 尝试用 .then、.fail 和 .reject 打破 jQuery 承诺链

    更新 此问题是 jQuery 1 7 与 1 8 的结果 永远不要在 1 7 中使用 Promise 因为它们不能通过在 a 中返回 Promise 来链接 then 1 8看起来他们并没有搞砸 http jsfiddle net delv
  • 如何在.Net core 3.1版本中以编程方式使用WCF服务

    我有一个 WCF 服务 它是使用 Net框架4 7 现在我必须使用以下命令以编程方式验证和解析 WCF 服务 Net Core 3 1 Web应用程序 without将 WCF 服务添加为服务参考 添加连接服务中的选项Visual Stud
  • Django 的collectstatic 有什么意义?

    在 Django 中 惯例是将应用程序特定的所有静态文件 即 css js 放入名为的文件夹中static 所以结构看起来像这样 mysite manage py mysite gt settings py etc myapp gt mod
  • 如何在实体框架中使用 DateTime.AddDays(x)

    我有这个代码 from pr in e ProgramSetup Include Program Include Program Client where pr DateBegin lt DateTime Now pr DateEnd gt
  • 我该如何修复这个错误? java.lang.OutOfMemoryError(无错误消息)

    构建 apk 时出错 谁收到此错误 我该如何修复此错误 Execution failed for task app packageDebug gt A failure occurred while executing com android
  • 同位素重排方法错误,没有这样的方法

    抱歉 如果我不是第一个 那么同位素重新布局方法有效吗 他们改变了还是我做错了什么 我有一个装有图像的容器 有时我需要用新图像替换图像 并且需要 重新布局 容器 container isotope reLayout 该方法返回 no such
  • Ant 代码未在 Maven 中运行

    这可能是我在 Java 中见过的最奇怪的事情 以下代码 不使用外部库 使用 Ant 完美运行 在 Netbeans 上 在 Windows 7 计算机上 public static void main String args throws
  • Javascript 中如何判断一个对象是否是对象字面量?

    有没有办法在 Javascript 中确定对象是否是使用创建的对象字面量 http www brainonfire net blog javascript object literal namespace 符号或使用构造函数方法 在我看来
  • Android - 按显示名称查找联系人

    我正在尝试按显示名称查找联系人 目标是打开此联系人并向其中添加更多数据 特别是更多电话号码 但我什至很难找到我想要更新的联系人 这是我正在使用的代码 public static String findContact Context cont
  • 将 app.config 加载到 AppDomain 中

    我无法将 App Config 文件加载到应用程序域中 我在用着 System AppDomain CurrentDomain SetData APP CONFIG FILE config path from Powershell 调用使用
  • 没有单独的 Javascript 文件的网络工作者?

    据我所知 Web Worker 需要编写在单独的 JavaScript 文件中 并按如下方式调用 new Worker longrunning js 我正在使用闭包编译器来组合和缩小我的所有 JavaScript 源代码 并且我不想让我的工
  • 从带引号的字符串中提取键值对

    我在为这一要求编写 优雅 解析器时遇到困难 看起来不像是一份C早餐 输入是一个字符串 键值对以 分隔并连接 key1 value1 key2 value2 欺骗我的部分是值可以用引号引起来 并且引号内的 不会结束键 key1 value1