我正在尝试匹配某些模式,请参考此online tool以便于测试
pattern = r"(^/\w+)\s*?(\w+)"
string_1 = "/path_one path_two"
string_2 = "/path_one_only"
虽然string_1通过返回两个部分按预期匹配,但对于string_2,它会剪切第一部分的最后一个字符。但我希望模式总是返回两个部分,如果路径2不存在则返回None / empty string
答案 0 :(得分:1)
使用此模式:
pattern = r"(^/\w+)\s*(\w*)"
现在第二个字符串将完全匹配第一个捕获组。
在这里可以看到最后一个字符被剪裁在第二个字符串中的原因:
(^/\w+) - matches 'path_one_onl'
\s*? - matches nothing (there are no spaces)
(\w+) - matches 'y'
换句话说,第二个捕获组强制要求在那里至少匹配一个字符。
答案 1 :(得分:1)
将您的模式字符串更改为
或者
pattern = r"(^/\w+)\s*(\w+)?"
和
pattern = r"(^/\w+)\s*(\w*)"
您不需要\s*?
,只需\s*
即可。
答案 2 :(得分:0)
您还可以通过在其周围添加非捕获组来使整个第二部分(包含空格)可选:
r"(^/\w+)(?:\s+(\w+))?"