无论如何要在空格处分隔但避免在文件路径处分隔?

Anyway to separate at whitespaces but avoid separating at file paths?

我正在尝试使用 regex:

将此字符串分隔成一个列表
-y -hwaccel cuda -threads 8 -loglevel error -hide_banner -stats -i - -c:v hevc_nvenc -rc constqp -preset p7 -qp 18 C:\Users\User\Documents\Python\Smoothie\test 124\Resampled_vid.mp4

我是用下面的方法来分离的:

split(r'(?!\)'+'\s+',f"{Settings[1]}".format(Input=InFile,Output=OutFile))

Output:
['-y', '-hwaccel', 'cuda', '-threads', '8', '-loglevel', 'error', '-hide_banner', '-stats', '-i', '-', '-c:v', 'hevc_nvenc', '-rc', 'constqp', '-preset', 'p7', '-qp', '18', 'C:\Users\User\Documents\Python\Smoothie\test', '124\Resampled_vid.mp4']

期望的输出:

['-y', '-hwaccel', 'cuda', '-threads', '8', '-loglevel', 'error', '-hide_banner', '-stats', '-i', '-', '-c:v', 'hevc_nvenc', '-rc', 'constqp', '-preset', 'p7', '-qp', '18', 'C:\Users\User\Documents\Python\Smoothie\test 124\Resampled_vid.mp4']

有没有办法,我可以完全避免在文件路径处拆分?

我会在这里使用 re.findall 方法:

inp = "-y -hwaccel cuda -threads 8 -loglevel error -hide_banner -stats -i - -c:v hevc_nvenc -rc constqp -preset p7 -qp 18 C:\Users\User\Documents\Python\Smoothie\test 124\Resampled_vid.mp4"
parts = re.findall(r'[A-Z]+:(?:\[^\]+)+\.\w+|\S+', inp)
print(parts)

['-y', '-hwaccel', 'cuda', '-threads', '8', '-loglevel', 'error', '-hide_banner',
 '-stats', '-i', '-', '-c:v', 'hevc_nvenc', '-rc', 'constqp', '-preset', 'p7',
 '-qp', '18',
 'C:\Users\User\Documents\Python\Smoothie\test 124\Resampled_vid.mp4']

此处使用的正则表达式模式表示匹配,或者:

[A-Z]+:(?:\[^\]+)+\.\w+  a file path
|                          OR
\S+                        any group of non whitespace characters

这里的技巧是首先急切地尝试匹配文件路径。只有失败,我们才会尝试一次匹配一个 word/term。