正则表达式 - 格式字符串中的捕获类型说明符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式 - 格式字符串中的捕获类型说明符相关的知识,希望对你有一定的参考价值。

考虑类似printf的函数的format参数。就像是:

printf("Hello %s, your rating is %i%%", name, percentage);

我想使用正则表达式捕获所有类型说明符(在上面的例子中,%s%i而不是%%)。

我开始使用天真的(%[^%])模式,但它错误地捕获了像%%f这样的东西,而不是“逃避”它。当然,%%%f应该被解释为一个转义的“%”,然后是一个说明符。

我想我需要一些更复杂的模式(也许是看后面的?),但无法解决它。有什么建议?

旁注:我知道我的模式不处理长度说明符和其他格式标记,如%2f等,但这对我很好,因为我的目标主要是枚举和计算格式说明符。

答案

一方面,你不能跳过字符而不会意外地捕捉像%%f这样的东西,所以你必须使用match或在你的正则表达式的开头放一个^(插入符号)。另一方面,在这种情况下,你不能使用findall。由于没有matchall函数,最简单的方法是编写自己的循环:

REG = re.compile('([^%]|%%)*(%[^%])')  # a bunch of (non-% or %%), and then (% followed by non-%).
def find_type_specifiers(st):
    retval = []
    pos = 0  # where to start searching for next time
    while True:
        match = REG.match(st, pos)
        if match is None:
            return retval
        retval.append(match.group(2))
        pos = match.end()

当然,您可以更改附加到retval的内容,例如你也对说明者的位置感兴趣。如果您只想要金额,可以换到柜台。

以上是关于正则表达式 - 格式字符串中的捕获类型说明符的主要内容,如果未能解决你的问题,请参考以下文章

VSCode 中的正则表达式:捕获每个字符/字母 - 不仅仅是 ASCII

融职教育Web前端学习 第3章 JavaScript基础教程10 正则表达式

正则表达式中的命名捕获组

如何使用正则表达式验证捕获组中的最后一个字符

笔记对字符串的一些操作

具有多个捕获组的 R 中的正则表达式组捕获