我有以下的正則表達式應該拉出3組正則表達式分組不是預期
^(ser-num.*|\[ser-num.*])(?:)?(\w+)?(?:)?(http://.*\.com/(?:s(?:erial)?|p(?:roduct)?)/\d+(?:/)?(?:\d+|(?:\w|-)+)?)
這兩個字符串:
strings = [
"ser-num recommend http://example.com/s/123456 ",
"ser-num http://example.com/s/123456 ",
]
當我運行這些對正則表達式我收到以下組:
('ser-num recommend ', None, 'http://example.com/s/123456')
('ser-num ', None, 'http://example.com/s/123456')
爲什麼我的第一個結果結合「推薦」成組\1
,而不是\2
?
這是我整個示例腳本:
import re
p = re.compile("""^(ser-num.*|\[ser-num.*])(?:)?(\w+)?(?:)?(http://.*\.com/(?:s(?:erial)?|p(?:roduct)?)/\d+(?:/)?(?:\d+|(?:\w|-)+)?)""")
strings = [
"ser-num recommend http://example.com/s/123456 ",
"ser-num http://example.com/s/123456 ",
]
for s in strings:
m = p.match(s)
try:
print m.groups()
except AttributeError:
print "Not a match for %s" % (s)
我正則表達式的explanation說,可選的組\2
確實存在。
更新基於評論:
如果我利用這個正則表達式
^(ser-num.*|\[ser-num.*])\s?(\w*)\s?(http://.*\.com/(?:s(?:erial)?|p(?:roduct)?)/\d+(?:/)?(?:\d+|(?:\w|-)+)?)
我收到這些結果(請注意組\2
空字符串而非None
)
('ser-num recommend ', '', 'http://example.com/s/123456')
('ser-num ', '', 'http://example.com/s/123456')
爲什麼使用'(?:)?'作爲空格而不是使用'?'? – RevanProdigalKnight 2014-09-03 18:45:52
或者甚至可能是'\ s *'爲空格,而'(\ w *)'爲可選詞? – abiessu 2014-09-03 18:46:39
'。*'是罪魁禍首,使用'\ S *'進行貪婪的非空格字符匹配。 – abiessu 2014-09-03 18:57:14