2 回答

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果您連續(xù)粘貼兩個(gè)正則表達(dá)式,它們將僅連續(xù)匹配文本。例如,如果組合a和b,則正則表達(dá)式ab將匹配文本ab,但不匹配acb。
您的組合正則表達(dá)式遇到了這個(gè)問題;您已將正則表達(dá)式融合在一起,這些正則表達(dá)式顯然可以單獨(dú)工作,但它們與直接相鄰的字符串不匹配,因此您必須添加一些填充來覆蓋輸入中的中間子字符串。
這是一個(gè)稍微重構(gòu)的版本,其中添加了填充,并且還進(jìn)行了一些常規(guī)修復(fù),以避免常見的正則表達(dá)式初學(xué)者錯(cuò)誤。
for item in re.finditer(r'''
(?P<host>\d+\.\d+\.\d+.\d+)
(?:[-\s]+)
(?P<user_name>\w+\d)
(?:[^[]+\[)
(?P<time>[^]]+)
(?:\][^]"]+")
(?P<request>[^"]+)''',
logdata, re.VERBOSE):
print(item.groupdict())
演示: https: //ideone.com/BsNLG7

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
我可能會(huì)簡(jiǎn)化您的正則表達(dá)式模式并僅re.findall在此處使用:
inp = '146.204.224.152 - feest6811 [21/Jun/2019:15:45:24 -0700] "POST /incentivize HTTP/1.1" 302 4622'
matches = re.findall(r'(\d+\.\d+\.\d+\.\d+) - (\S+) \[(.*?)\] "(.*?)"', inp)
print(matches)
這將生成一個(gè)元組列表,其中包含您想要的四個(gè)捕獲術(shù)語:
[('146.204.224.152', 'feest6811', '21/Jun/2019:15:45:24 -0700', 'POST /incentivize HTTP/1.1')]
添加回答
舉報(bào)