用于从用户获取格式化输入的 Python 函数,类似于“C”中的 scanf()

And*_*dar 3 python

我想知道Python中是否有一个函数可以从用户那里获取格式化scanf()输入,类似于在'C'中使用和格式化字符串(例如%d%lf等)从用户那里获取输入。

scanf()返回 a的假设示例list

input_date_list = scanf("%d-%d-%d")
# User enters "1969-04-20"
input_time_list = scanf("%d:%d")
# User enters "04:20"
print(input_date_list, input_time_list)
# Output is "[1969, 4, 20] [4, 20]"
Run Code Online (Sandbox Code Playgroud)

ton*_*mke 5

标准库提供什么

标准库中没有直接等效的 scanf(3)。该re模块的文档建议将其本身作为替代品,并提供以下解释

Python 目前没有与 scanf() 等效的函数。正则表达式通常比 scanf() 格式字符串更强大,但也更冗长。下表提供了 scanf() 格式标记和正则表达式之间的一些或多或少等效的映射。

修改你的假设示例,使用正则表达式,我们得到......

import re

input_date_list = re.match(r"(?P<month>[-+]?\d+)-(?P<day>[-+]?\d+)-(?P<year>[-+]?\d+)", input())
print(f"[{input_date_list['year']}, {input_date_list['month']}, {input_date_list['day']}]")

input_time_list = re.match(r"(?P<hour>[-+]?\d+):(?P<minute>[-+]?\d+)", input())
print(f"[{input_time_list['hour']}, {input_time_list['minute']}]")
Run Code Online (Sandbox Code Playgroud)

...执行时:

python script.py << EOF
1-2-2023
11:59
EOF
[2023, 1, 2]
[11, 59]

Run Code Online (Sandbox Code Playgroud)

社区实施

Pypi 上的scanf 模块提供了一个更类似于 scanf(3) 的接口。

这提供了您的假设示例的直接实现:

from scanf import scanf

input_date_list = scanf("%d-%d-%d")
input_time_list = scanf("%d:%d")

print(input_date_list, input_time_list)
Run Code Online (Sandbox Code Playgroud)

...执行时:

python script.py << EOF
1-2-2023
11:59
EOF
(1, 2, 2023) (11, 59)
Run Code Online (Sandbox Code Playgroud)