结合 f 字符串和原始字符串文字

lam*_*lex 44 python python-3.x f-string

我想知道如何在使用 f-string 的同时r获取原始字符串文字。我目前有它如下但想要允许任何名称替换的选项Alex我正在考虑添加一个 f 字符串,然后用Alex花括号替换并将用户名放在里面,但这不适用于r.

username = input('Enter name')
download_folder = r'C:\Users\Alex\Downloads'
Run Code Online (Sandbox Code Playgroud)

raj*_*ah9 94

您可以将ffor a f-string 与rfor a raw string 结合使用:

user = 'Alex'
dirToSee = fr'C:\Users\{user}\Downloads'
print (dirToSee) # prints C:\Users\Alex\Downloads
Run Code Online (Sandbox Code Playgroud)

r只禁止反斜杠转义序列处理,而不是F-字符串处理。

引用文档

'f' 可以与 'r' 组合,但不能与 'b' 或 'u' 组合,因此原始格式化字符串是可能的,但格式化字节文字不是。

...

除非存在“r”或“R”前缀,否则字符串和字节文字中的转义序列将被解释...

  • @lammyalex `rf` 也应该有效。请参阅[字符串和字节文字](https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals) (4认同)
  • 对我来说,这是一个警告,而不是错误:它不向后兼容早期版本的 Python。它在 Python 3.6 及更高版本上运行良好。 (3认同)
  • 啊,太谢谢你了。我尝试做射频但没有成功。 (2认同)
  • 使用 `fr` PyCharm IDE 时显示错误,但当您运行代码时,它可以正常工作。 (2认同)
  • 3.5 及以下版本已经不支持 f 字符串,因此使用 `rf` 或 `fr` 作为前缀不会导致特殊的兼容性问题。 (2认同)

Jam*_*ger 10

或者,您可以使用该str.format()方法。

name = input("What is your name? ")
print(r"C:\Users\{name}\Downloads".format(name=name))
Run Code Online (Sandbox Code Playgroud)

这将通过插入name值来格式化原始字符串。


Eri*_*nil 5

正如其他人提到的,确实可以混合rf。但要小心,因为默认情况下内插的字符串不是原始的:

not_escaped = "\not_escaped"
half_escaped = rf"escaped_{not_escaped}"

print(half_escaped)
### outputs:
# escaped_
# ot_escaped
Run Code Online (Sandbox Code Playgroud)

您也必须使用r插值字符串:

escaped = r"\n_escaped"
full_escaped = rf"escaped_too_{escaped}"

print(full_escaped)
# escaped_too_\n_escaped
Run Code Online (Sandbox Code Playgroud)