簡體   English   中英

正則表達式匹配除字符串以外的所有

[英]Regular expression matching all but a string

我需要找到匹配模式的所有字符串,但兩個給定的字符串除外。

例如,查找除aabb之外的所有字母組。 從這個字符串開始:

-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)否定前瞻,檢查-是否后跟aabb

  • ([^-]+)匹配除了以外的ony或更多字符-


編輯

上面的正則表達式與那些以aabb開頭的正則表達式不匹配,例如-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.

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