簡體   English   中英

Python正則表達式匹配字符串排除字

[英]Python regex to match string excluding word

我有關於構建正則表達式的問題,我在Google,Stack Overflow和其他文檔中搜索了2天...

我有以下幾行:

2015-07-08 12:49:07.183852|INFO    |VirtualServerBase|  3| client disconnected 'Ròem'(id:6336) reason 'invokerid=20 invokername=Alphonse invokeruid=loremipsum2= reasonmsg=test'
2015-07-08 11:59:23.178055|INFO    |VirtualServerBase|  3| client disconnected 'Trakiyen'(id:20460) reason 'invokerid=0 invokername=server reasonmsg=idle time exceeded'
2015-07-08 12:40:50.591450|INFO    |VirtualServerBase|  3| client disconnected 'kalash'(id:20464) reason 'invokerid=136 invokername=Charles invokeruid=loremipsum= reasonmsg=Aller, Bisous! bantime=0
2015-07-08 00:23:03.235312|INFO    |VirtualServerBase|  3| client disconnected 'Brigata FTW'(id:20451) reason 'invokerid=103 invokername=Bob invokeruid=loremipsum3= reasonmsg=En vous souhaitant une bonne soirée <3 bantime=28800'

我想只匹配第一行,遵循這些條件:

  1. 沒有invokername=server
  2. 沒有線與bantime

在這種情況下,結果應該只匹配第一行與以下正則表達式:

.*2015-07-08.*client disconnected.*invokername=[^server].*[^bantime=].*

我只在這里寫了一個正則表達式,但我嘗試了許多不同的東西(用?!等)。 我已經閱讀了很多關於在Stack Overflow上排除但無法找到解決方案的主題。 我希望有人會幫助我。

你可以得到你的路線

(?m)^(?!.*\b(?:invokername=server|bantime)\b).*2015-07-08.*client disconnected.*invokername=.*$

演示

解釋

  • (?m) - 多行標志,以便^$可以在句子的開頭和結尾匹配。
  • ^ - 線錨的開始
  • (?!.*\\b(?:invokername=server|bantime)\\b) - 一個負面的(?!.*\\b(?:invokername=server|bantime)\\b) ,確保沒有整個單詞invokername=serverbantime進一步上線
  • .*2015-07-08.*client disconnected.*invokername=.* - 包含2015-07-08子字符串, client disconnectedinvokername=並且任何內容都可以在這些子字符串之間(但是換行符)。
  • $ - 行尾

或者,您可以匹配*任何沒有不允許的子串的行:

(?m)^(?!.*\b(?:invokername=server|bantime)\b).*$

如果它沒有“超匹配”,這是一個更好的選擇。

你似乎把[^...](?!...)混淆了。 前者是一個否定的角色類群,而后者是一個負面的先行者。

如果我們現在還要記住在當前位置應用負前瞻,我們需要:

.*?2015-07-08.*?client disconnected.*?(invokername=(?!server))((?!.*?bantime=).*)

編輯:信用到期的信用:@ stribizhev的解決方案比我的更好:

(?m)^(?!.*\b(?:invokername=server|bantime)\b).*$

除了@ llogiq的答案解釋了否定字符類負面預測之間的區別之外,您還可以使用以下正則表達式使用負面預測:

^((?!bantime|(?:invokername=server)).)*$

請參閱演示https://regex101.com/r/hI5dR0/1

>>> re.search(r'^((?!bantime|(invokername=server)).)*$',s,re.M).group()
"015-07-08 12:49:07.183852|INFO    |VirtualServerBase|  3| client disconnected 'R\xc3\xb2em'(id:6336) reason 'invokerid=20 invokername=Alphonse invokeruid=loremipsum2= reasonmsg=test'"

暫無
暫無

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

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