在我的一个项目中,我将字符串传递给使用格式说明语格式化它的格式化程序子类。在我的例子中,它是自定义的(使用格式化程序类的特性),方法是添加额外的bang转换器:!u将产生的字符串转换为小写,!c转换为titlecase,!q使任何方括号(因为原因)加倍,等等。
例如,使用a = "toFu","{a!c}"变成"Tofu"
如何使我的系统使用f-string 语法,以便将"{a+a!c}"转换为"Tofutofu"?
注意:我不是想要一种使f"{a+a!c}" (注意到f的存在)解析为"Tofutofu"的方法,这是钩入内置python f-string格式机器所涵盖的,我是在问是否有一种方法可以让函数或任何形式的python代码将"{a+a!c}" (注意到没有f)转换为"Tofutofu"。
发布于 2022-06-01 01:10:37
从@Tomerikoo的救生答案演变而来,代码如下:
import re
def formatter(s):
def replacement(match):
pre, bangs, suf = match.group(1, 2, 3)
# pre : the part before the first bang
# bangs : the bang (if any) and the characters going with it
# suf : the colon (if any) and the characters going with it
if not bangs:
return eval("f\"{" + pre + suf + "}\"")
conversion = set(bangs[1:]) # the first character is always a bang
sra = conversion - set("tiqulc")
conversion = conversion - sra
if sra:
sra = "!" + "".join(sra)
value = eval("f\"{" + pre + (sra or "") + suf + "}\"")
if "q" in conversion:
value = value.replace("{", "{{")
if "u" in conversion:
value = value.upper()
if "l" in conversion:
value = value.lower()
if "c" in conversion and value:
value = value.capitalize()
return value
return re.sub(r"{([^!:\n]+)((?:![^!:\n]+)?)((?::[^!:\n]+)?)}", replacement, s)我在上面评论的三个组的结果都是巨大的。
注意:它仍然使用eval (无论如何都不能接受),它不允许多行替换字段,它可能会导致问题和/或差异,在!和:之间放置空格。但这对我来说是可以接受的。
发布于 2022-05-31 15:49:38
不确定我仍然完全理解您需要什么,但是从问题和一些注释中给出的详细信息来看,下面是一个函数,它以您指定的格式解析字符串,并给出所需的结果:
import re
def formatter(s):
def replacement(match):
expr, frmt = match[1].split('!')
if frmt == 'c':
return eval(expr).title()
return re.sub(r"{([^{]+)}", replacement, s)
a = "toFu"
print(formatter("blah {a!c}"))
print(formatter("{a+a!c}blah"))产出:
blah Tofu
Tofutofublah这使用了repl函数的re.sub参数的函数变体。这个函数(replacement)可以进一步扩展,以支持所有其他!x。
主要缺点:
eval是邪恶的。:0.3也许有人能从这里得到改善。
发布于 2022-05-31 11:54:48
请检查只允许指定的字符:'s‘、'r’或'a‘
https://stackoverflow.com/questions/72447176
复制相似问题