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