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

时间:2017-07-20 13:06:20

标签: regex escaping string-formatting

考虑一个printf - 类函数的format参数。类似的东西:

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

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

我开始使用天真的(%[^%])模式,但错误地捕获%%f之类的内容,而不是“转义”它。当然,%%%f应该被解释为转义的“%”,然后是说明符。

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

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

1 个答案:

答案 0 :(得分:1)

一方面,您不能在不小心捕捉WHERE Tour.TourId = 4 之类的内容的情况下跳过字符,因此您必须使用%%f或在{0}开头使用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() 的内容,例如你也对说明者的位置感兴趣。如果您只想要金额,可以换到计数器。