正则表达式 - 格式字符串中的捕获类型说明符
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