2017-05-03 66 views
3

這是this question(儘管我沒有問過)的後續行動。試圖回答,我遇到了一些問題。在特定地點匹配

考慮串strings123[abc789<span>123</span>def<span>456</span>000]strings456,怎麼會(使用新的regex模塊)匹配不被span標籤Python包圍在方括號中數字?
在示例字符串中,這將是789000


我擺弄周圍用 \G像( demo

(?:\G(?!\A)|\[) 
[^\d\]]* 
\K 
\d+ 

(*SKIP)(*FAIL)(​​):

<span>.*?</span>(*SKIP)(*FAIL) 
| 
\d+ 

但無法既statements結合:

<span>.*?</span>(*SKIP)(*FAIL) 
| 
(?: 
    (?:\G(?!\A)|\[) 
    [^\d\]]* 
    (\d+) 
    [^\d\]]* 
    \K 
) 

哪有這樣做?

+0

我可以想到一個多步驟的解決方案,好嗎? – Rahul

回答

3

一個我喜歡PyPi regex module的事情是,它支持無限寬度回顧後

  • 可變長度回顧後

              lookbehind可以匹配變長字符串。

>>> import regex 
>>> s = 'strings123[abc789<span>123</span>def<span>456</span>000]strings456' 
>>> rx = r'(?<=\[[^][]*)(?:<span>[^<]*</span>(*SKIP)(?!)|\d+)(?=[^][]*])' 
>>> regex.findall(rx, s) 
['789', '000'] 
>>> 

圖案的詳細資料

  • (?<=\[[^][]*) - 必須有一個[注視着到當前位置的左邊比]其他零個或多個字符和[立即
  • (?: - 非捕獲組開始
    • <span>[^<]*</span>(*SKIP)(?!) - 匹配<span>,然後0+字符以外<(用[^<]*否定字符類),然後</span>並放棄比賽在比賽結束位置停留一段時間,去尋找下一場比賽
    • | - 或
    • \d+ - 1+位數
  • (?=[^][]*]) - 必須有一個]後比][ IMMED其他零個或多個字符Iely在當前位置的右側。
+1

謝謝Wiktor,這工作。 – Jan

1

我想到了一個如下的算法。

  1. 搜索方括號及其內容並將結果存儲在變量中。正則表達式將是\[[^]]*\]

  2. 現在搜索<span>標籤,並將其替換爲-,只是爲了簡化下一步驟。正則表達式將是(<span>.*?</span>)

  3. 現在你將剩下方括號的內容,而不是<span>標籤中的內容。只需使用\d+來匹配數字即可搜索。

+1

謝謝。沒有提到我想要*一個*正則表達式,但是當然你的算法仍然有效。 – Jan

+0

@Jan:謝謝。 ☺ – Rahul