簡體   English   中英

如何改進此正則表達式以在其他情況下工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM