在特定位置匹配

2024-04-25 07:34:36 发布

您现在位置:Python中文网/ 问答频道 /正文

这是this question的后续内容(不过我没有问)。试图回答时,我遇到了几个问题。你知道吗

考虑字符串strings123[abc789<span>123</span>def<span>456</span>000]strings456,如何匹配方括号中没有被Python标记包围的数字(使用较新的regex模块)?
在示例字符串中,这将是789000


我在摆弄\G就像(demo
(?:\G(?!\A)|\[)
[^\d\]]*
\K
\d+

(*SKIP)(*FAIL)demo):

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

但无法同时合并statements

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

如何做到这一点?你知道吗


Tags: 字符串标记内容demodef数字thisfail
2条回答

我喜欢PyPi regex module的一点是它支持无限宽lookback

  • Variable-length lookbehind

       A lookbehind can match a variable-length string.

>>> 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+位
  • (?=[^][]*])-在当前位置右侧的][之外的零个或多个字符后面必须有一个]。你知道吗

我想到了一个如下的算法。你知道吗

  1. 搜索方括号和其中的内容,并将结果存储在变量中。正则表达式应该是^{}

  2. 现在搜索<span>标记并将其替换为-,以简化下一步。正则表达式应该是^{}

  3. 现在您将看到方括号中的内容,而不是<span>标记中的内容。只需用^{}搜索匹配数字。

相关问题 更多 >