[英]How to improve this regular expression to work in other situations?
我可以分割此字符串:
199.72.81.55 - - [01/Jul/1995:00:00:01 -0400] "GET /history/apollo/ HTTP/1.0" 200 6245
與此正則表達式:
'([(\d\.)]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'
因此,如何改進此RegEx以拆分這種字符串( 在這里有Internet地址而不是IP ):
unicomp6.unicomp.net - - [01/Jul/1995:00:00:06 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3985
和這種字符串( 在雙引號之間有雙引號,而我沒有最后一個數字 )
frank.mtsu.edu - - [03/Jul/1995:02:41:15 -0400] "GET /images/" HTTP/1.0" 404 -
謝謝!
對於這種情況|
運算符的含義或有用,對於第二個示例,您可以將表達式修改為:
'([(\d\.)]+|[a-z\d\.]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'
請注意,這假定所有地址僅由小寫字母數字和點組成。 編輯: @tripleee
評論后,我必須承認地址可能包含更多不同的字符,因此我添加了更多的容忍解決方案:
'([(\d\.)]+|[^ ]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'
這個假設地址可能包含任何非空格字符。 如果太寬容,請隨時改進早期版本。 如評論中所述,它是多余的,可能會被替換為
'([^ ]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'
要使其與最后一種情況一起使用,只需將@ (\\d+|-)
替換為最后一個(\\d+)
(\\d+|-)
,如@solarc
前面所建議
我不知道您要做什么,但是您的正則表達式不是很具體。 以下是可能有改進的建議解決方案。 它看起來很復雜,但是一旦分解就還算不錯。
^(\\b(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b|\\w+\\.\\w+\\.(?:net|com|gov|edu))\\s-\\s-\\s(\\[[0-9]{2}\\/\\w{3}\\/[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2}\\s-[0-9]{4}\\])\\s(\\"[^\\"]+\\")\\s(.*)$
請訪問https://regex101.com/r/ojIGIA/3,以查看它的運行情況,有關說明,請閱讀右側欄。
編輯:我意識到我錯過了?
我也忘記了轉義"
因為我沒有考慮python的風味。修復並更新了Regex和鏈接。
現在,我有更多時間來進一步解釋我所做的事情。 上面的正則表達式可以按如下方式拆分。
^
行首
(
開始捕獲組1
\\b(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b
這正在捕獲IP地址。 根據您要達到的精度,您可以執行\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}
如果您不太擔心的話。 這也將匹配所有有效的IP地址,但也將匹配一些無效的IP地址。
|
OR運算符
\\w+\\.\\w+\\.(?:net|com|gov|edu)
這是一個非常基本的示例,顯示了URL捕獲的外觀。
)
結束捕獲組1
\\s-\\s-\\s
您的“--”完全匹配
(\\[[0-9]{2}\\/\\w{3}\\/[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2}\\s-[0-9]{4}\\])
這是我建議在中間捕獲日期和其他內容的建議。 它將需要根據您的實際需要進行調整。 這也是捕獲組2。
\\s
一個空格
(\\"[^\\"]+\\")
在比賽的這一點匹配逗號內的所有內容,捕獲組3。
\\s
一個空格
(.*)
匹配其他所有內容直到結尾,然后放入捕獲組4。
$
行尾
現在這些都是建議,因為我不知道您到底想做什么,但希望這會有所幫助並給您一些想法。
請注意,我使用\\ s代替空格。 使用空格沒有什么問題,我個人喜歡使用\\ s,因為它對我來說更容易閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.