问题的背景如下。我希望获取wget尝试下载的文件,但需要忽略可能出现或可能不出现的标志。
例如。 wget -qO http://google.com/myfile.sh
。预期输出为:http://google.com/myfile.sh
。对于这个例子,正则表达式:
r'wget\s-\w+\s([^\s]*)'
似乎可以解决问题。但是,没有标志时将无效。
为了让(可能缺席)标志起作用我尝试了:r'wget\s[-\w+\s]?([^\s]*)'
我希望能说“你可以期待0或1个破折号后跟一些字符的实例”,但它似乎认为-\w+\s
的顺序是可选的,至少是我对以下结果的解释:
import re
re.search(r'wget\s-\w+\s([^\s]*)','wget -qO http://google.com/myfile.sh').group(1)
>>> 'http://google.com/myfile.sh'
re.search(r'wget\s[-\w+\s]?([^\s]*)','wget -qO http://google.com/myfile.sh').group(1)
>>> 'q0'
re.search(r'wget\s[-\w+\s]*([^\s]*)','wget -qO http://google.com/myfile.sh').group(1)
>>> '://google.com/myfile.sh'
有人可以解释最后两个结果,并说明如何确保它匹配0个或更多标志吗?
答案 0 :(得分:1)
尝试以下方法:
wget\s*(?:-\w+)?\s*(.*)
https://regex101.com/r/aDWM3X/1以供参考
您的示例无法正常工作的原因是因为您使用的括号表示"以下任何字符或范围"同时也在\ w之后使用+(这并不意味着\ w中的一个或多个,它意味着寻找任何\ w,任何+ ....如果你使用一个组然后你可以使组可选吗?(零或1)或*如果它可以是零或无限