【问题标题】:Is there a way to parse %-style strings like string.Formatter.parse有没有办法解析像 string.Formatter.parse 这样的 %-style 字符串
【发布时间】:2015-11-25 21:17:18
【问题描述】:

我需要得到一个字符串中所有占位符的列表:

因此,"There're %(num_items)d items in the %(container)s" 应该产生 (('num_items', 'd'), ('container', 's'))

我尝试了什么:

1) 我尝试查看源代码,发现

PyObject *
PyString_Format(PyObject *format, PyObject *args)

函数在 C 级别进行 % 插值。

2) 我也尝试搜索 pypi 并找到了一个 parse 库,它与 string.Formatter.parse 执行相同的操作,它正在解析 {} 样式的字符串,这不是我需要的。

警告:一个快速的正则表达式不太可能涵盖 % 替换的所有 语法,这正是我所需要的。

类似问题:How can I find all placeholders for str.format in a python string using a regex?

更新

使用相当复杂的正则表达式似乎可以很好地解决它,因此它将成为一项不错的家庭作业。

我会在两天内接受this 作为答案,我预计不会有任何新的答案。

更新2

问题是否如此本地化以至于对其他人永远不会有用 (除了那些上同一门课的人)?如果是,请投票关闭。

(来自Please clarify the policy on homework questions

【问题讨论】:

  • 是的,在不发表评论的情况下投票结束是一种非常好的行为
  • 看来您要的是图书馆,这应该可以解释近距离投票
  • @Tim Castelijns 是的,可能。我已仔细改写问题以避免此类指控。
  • 我会这样表述它正则表达式不太可能涵盖 %-substitution 的所有语法,所以我正在寻找另一种解决方案,删除任何可能看起来像你的东西'要图书馆
  • @Tim Castelijns 谢谢,已修复

标签: python regex string parsing


【解决方案1】:
import re

s = "There're %(num_items)d items in the %(container)s"
print re.findall(r'%\((.*?)\)', s)

【讨论】:

  • 谢谢,但是这个正则表达式并没有涵盖 %-substitution 的所有语法
  • 除了%s 之类的东西之外,它还会遗漏什么,在这种情况下你想提取什么?
  • @chepner 请查看关于“%插值”的python帮助,了解插值字符串中可能存在的各种标记。我需要提取(名称,类型)元组。
  • 编辑您的问题。它仅表示您想要% 之后的名称。
  • @chepner 谢谢,已编辑。是的,它会错过%s。并且会在%%(aaa)中找到aaa
【解决方案2】:

我最终得到了这个正则表达式:

re.findall(r'%\(([^)]+)\)[0-9]*(?:\.[0-9]*)?([diouxXeEfFgGcrs%])', a)

作为问题的合理近似(匹配 7 个标记中的 5 个)。

【讨论】:

  • %\(([^)]+)\) 之外的额外内容是什么?
  • @sln 匹配%(x)12.3f。但我不想只匹配%(x)12.3f。我想匹配任何能够插入字符串的东西。另外,我稍微更新了问题:我发现类型信息对我也很有用。
  • 哦,有点像 printf
猜你喜欢
  • 2020-05-16
  • 2023-04-01
  • 1970-01-01
  • 2020-02-14
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多