2017-05-03 68 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