簡體   English   中英

Python正則表達式負回顧

[英]Python regex negative lookbehind

我們解析由自動化腳本創建的日志。 我們關心的一個典型的事情是來自以下行的字符串: '1.10.07-SNAPSHOT (1.10.07-20110303.024749-7)'

15:28:02.115 - INFO   - TestLib: Successfully retrieved build version: '1.11.11-SNAPSHOT (1.11.11-20110303.024749-7)'

問題是,有些日志是手動創建的,用戶自己輸入這些信息。 為了提醒自己的格式,他們添加了一個帶有模板的對話框:

02:24:50.655 - INFO   - gui: Step Dialog: For test results management purposes, specify the build in which the test is executed in the following format, build version: 'specify version here'
02:25:04.905 - INFO   - gui:     Response: OK
02:25:04.905 - INFO   - gui:     Comments: 'build version: '1.11.11''

我目前的正則表達式是.*[Bb]uild [Vv]ersion:*\\s*(?!.*<)'?([^']*)' '(?!.*<)'是我第一次嘗試避免這個問題,因為有些用戶會寫 ''。 但這並沒有抓住上述情況。 我認為正確的做法是消極回溯,如果線路上存在'Step Dialog'則不匹配,但根據regexr 的說法,我嘗試編寫它似乎失敗了(出於某種原因,它不是讓我分享到我保存的表單的鏈接)。 我認為負回顧看起來像這樣: (?<!Step Dialog)並導致:

`(?<!Step Dialog).*[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)'`

但出於某種原因,這與上面的第一行和第三行都匹配。

編輯:
'[Bb]' 和 ': \\s ' 適用於通過使用多個冒號和空格(大寫的“Build”)以不完全正確的格式輸入信息的用戶。 對一般情況下的清理建議表示贊賞,我對正則表達式比較陌生。

你很接近,但它仍然匹配,因為它可以找到一個滿足.*的字符串,而前面沒有Step Dialog 正面和負面的斷言只會影響直接圍繞它們的模式。 因此,您必須強制它檢查您不希望匹配Step Dialog每個字符。

嘗試這個:

`^(?:(?!Step Dialog).)*[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)'`

現在,它確保^ (行的開頭)和[Bb]uild [Vv]ersion之間的每個字符都不是字符串Step Dialog

您會注意到我還將其更改為積極的前瞻,因為這樣更容易理解正在發生的事情。

有幾種方法可以做到這一點,但你已經很接近了。

`.*(?<!Step Dialog.*)[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)'`
`^(?!.*Step Dialog).*[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)'`

Chriszuma 的模式也應該有效。 使用您最喜歡的那個。 如果考慮性能,您可以對三種模式進行基准測試,看看哪個更快。 我的感覺是它會以``.(?)` 開頭,但我不能肯定。

編輯:正如 ekhumoro 指出的那樣, Python 正則表達式引擎需要固定長度的 lookbehinds ,所以第一個在 Python 中不起作用。 不過第二個應該沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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