[英]Regular expression matching all but a string
我需要找到匹配模式的所有字符串,但兩個給定的字符串除外。
例如,查找除aa
和bb
之外的所有字母組。 從這個字符串開始:
-a-bc-aa-def-bb-ghij-
應該返回:
('a', 'bc', 'def', 'ghij')
我嘗試使用這個捕獲4個字符串的正則表達式。 我以為我已經接近了,但(1)它在Python中不起作用,(2)我無法弄清楚如何從搜索中排除一些字符串。 (是的,我可以在以后刪除它們,但我真實的正則表達式一次性完成所有操作,我想在其中包含最后一步。)
我說它在Python中不起作用,因為我試過這個,期望完全相同的結果,但我得到的只是第一組:
>>> import re
>>> re.search('-(\w.*?)(?=-)', '-a-bc-def-ghij-').groups()
('a',)
我試着用負面向前看,但我找不到適合這種情況的解決方案。
你可以利用負面展望。
例如,
>>> re.findall(r'-(?!aa|bb)([^-]+)', string)
['a', 'bc', 'def', 'ghij']
-
比賽-
(?!aa|bb)
否定前瞻,檢查-
是否后跟aa
或bb
([^-]+)
匹配除了以外的ony或更多字符-
編輯
上面的正則表達式與那些以aa
或bb
開頭的正則表達式不匹配,例如-aabc-
。 為了照顧我們可以添加-
像前面這樣的,
>>> re.findall(r'-(?!aa-|bb-)([^-]+)', string)
您需要使用負前瞻來限制更通用的模式,使用re.findall
來查找所有匹配項。
采用
res = re.findall(r'-(?!(?:aa|bb)-)(\w+)(?=-)', s)
或 - 如果連字符之間的值可以是除連字符之外的任何值,請使用否定字符類[^-]
:
res = re.findall(r'-(?!(?:aa|bb)-)([^-]+)(?=-)', s)
這是正則表達式演示 。
細節 :
-
- 連字符 (?!(?:aa|bb)-)
-如果有一個aa-
或bb-
第一個連字符后,敵不過應退還 (\\w+)
- 第1組(此值將由re.findall
調用返回)捕獲1個或多個字符或 [^-]+
- 除1以外的1個或多個字符-
(?=-)
- 必須有一個-
字后面的字符。 這里需要前瞻以確保重疊匹配(因為此連字符將成為下一個匹配的起點)。 Python演示 :
import re
p = re.compile(r'-(?!(?:aa|bb)-)([^-]+)(?=-)')
s = "-a-bc-aa-def-bb-ghij-"
print(p.findall(s)) # => ['a', 'bc', 'def', 'ghij']
雖然要求使用正則表達式解決方案,但我認為使用更簡單的python函數(即字符串拆分和過濾)可以更輕松地解決這個問題:
input_list = "-a-bc-aa-def-bb-ghij-"
exclude = set(["aa", "bb"])
result = [s for s in input_list.split('-')[1:-1] if s not in exclude]
該解決方案具有額外的優點,即result
也可以轉換為生成器,並且不需要顯式地構造結果列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.