我有一個輸入文本:text = '146.204.224.152 - feest6811 [21/Jun/2019:15:45:24 -0700] "POST /incentivize HTTP/1.1" 302 4622\n197.109.77.178 - kertzmann3129 [21/Jun/2019:15:45:25 -0700] "DELETE /virtual/solutions/target/web+services HTTP/2.0" 203 26554\n156.127.178.177 - [21/Jun/2019:15:45:27 -0700] "DELETE /interactive/transparent/niches/revolutionize HTTP/1.1output Required :['feest6811','kertzmann3129','-']output getting :[ ' feest6811', ' kertzmann3129',' ']下面是使用的代碼user_name = re.findall('(?<=[-])\s[a-zA-Z0-9]*',text)第二個輸出所需:['POST /incentivize HTTP/1.1','DELETE /virtual/solutions/target/web+services HTTP/2.0','DELETE /interactive/transparent/niches/revolutionize HTTP/1.1']Output getting :['POST /incentivize HTTP/1.','DELETE /virtual/solutions/target/web+services HTTP/2.','DELETE /interactive/transparent/niches/revolutionize HTTP/1.']以下是用于上述第二個輸出的代碼request = re.findall('[a-zA-Z]*\s/[a-zA-Z].*[.\+]',text)正如你所看到的,我在輸出 1 和 2 中都遺漏了一些小東西在輸出 1 中,當我們沒有數據時,我缺少“-”符號,而在第二個輸出中,我無法讀取“.”之后的最后一個單詞。任何人都可以建議對代碼進行必要的更改嗎?
3 回答

侃侃無極
TA貢獻2051條經驗 獲得超10個贊

慕容3067478
TA貢獻1773條經驗 獲得超3個贊
首先,您需要稍微調整。你需要但是\s
與lookbehind
user_name = re.findall('(?<=[-]\s)[a-zA-Z0-9]*', text) print(user_name)
但這會產生:
['feest6811', 'kertzmann3129', '']
您無法將“-”作為返回列表的第三個值,因為后視從來不是匹配的一部分。您想要在最終匹配中輸入的第三個-
輸入字符串findall
位于以下上下文中:
156.127.178.177 - [21/Jun/2019:15:45:27 -0700]
在本例中返回 '' 的正則表達式同樣可以很好地指示輸入字符串中是否存在 '-' 以及相應的空子[a-zA-Z0-9]*
表達式匹配項。如果這確實困擾您,您可以隨時這樣做:
user_name = re.findall('(?<=[-]\s)[a-zA-Z0-9]*', text) user_name = ['-' if x == '' else x for x in user_name] # convert '' to '-' print(user_name)
印刷:
['feest6811', 'kertzmann3129', '-']
對于第二個使用:
request = re.findall(r'[a-zA-Z]*\s/[a-zA-Z].*?/\d\.\d', text)

一只甜甜圈
TA貢獻1836條經驗 獲得超5個贊
我喜歡使用 Regex101.com 來構建這樣的正則表達式。
請嘗試以下操作
1.這是更正后的版本:https ://regex101.com/r/bFDnSm/2
請注意正則表達式更改為
(?<=[-]\s)[a-zA-Z0-9]*
這是更正后的版本: https ://regex101.com/r/4uLVUb/1
請注意正則表達式更改為:
[a-zA-Z]*\s/[a-zA-Z+/]+\s[AZ]+/[0-9.]+
您應該發現它非常廣泛,甚至可以使用更多示例。
添加回答
舉報
0/150
提交
取消