我有一个指定的正文块,其中包含格式如下的 GitHub Markdown 列表:

**HEADERONE**
- [x] Logged In
- [ ] Logged Out
- [x] Spun Around
- [x] Did the hokey pokey

但是该列表被其他类似这样的垃圾包围:

A body paragraph about other things. Lorem ipsom and all that

**HEADERONE**
- [x] Logged In
- [ ] Logged Out
- [x] Spun Around
- [x] Did the hokey pokey

Maybe a link here www.go_ogle.com

Another list that isn't important
- [ ] Thing one
- [ ] Thing two
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo

我可以在抓取后以编程方式切割字符串,但我很好奇是否有一种非常干净的方法来抓取我的列表? header 总是相同的,所以从 **HEADERONE** 抓取直到双新行的第一个实例可以正常工作。不过,从 **HEADERONE** 抓取到最后一行的结尾 - [ 会很棒。

我正在使用

\*\*HEADERONE\*\*[^*]*?(?=\n{2})

但是虽然这在 regex101 中有效,但 re.search("\*\*HEADERONE\*\*[^*]*?(?=\n{2})",body) 由于某种原因不返回任何内容。
所以我把它切换到

\*\*HEADERONE\*\*[\S\s]*?(?=\n{2})

但这太多了,包括第二个列表。有什么想法吗?

最佳答案

虽然用 (?=\n{2}) 替换 (?=(?:\r\n){2}) 可以解决问题,因为输入中有 CRLF 结尾,但我建议使用更精确的模式:

m = re.search(r'^\*\*HEADERONE\*\*(?:\r?\n-\s*\[[^][]*].*)*', s, re.M)
if m:
    print(m.group())

请参阅 regex demoPython demo

说明
  • ^ - 行首(re.M 重新定义了 ^ anchor 行为)
  • \*\*HEADERONE\*\* - **HEADERONE** 字符串
  • (?:\r?\n-\s*\[[^][]*].*)* - 零个或多个连续重复
  • \r?\n - 仅以 CRLF 或 LF 结尾的
  • - - 一个连字符
  • \s* - 0+ 空格
  • \[ - [ 字符
  • [^][]* - ][
  • 以外的 0+ 个字符
  • ] - ]
  • .* - 该行的其余部分。

  • 此外,还有一种方法可以使用非正则表达式获取文件中的所有匹配项:
    res = []
    tmp = []
    inblock = False
    for line in f:  # f is a handle to the open file, or use s.splitlines() to split the string s into lines
        if line == '**HEADERONE**':
            tmp.append(line.rstrip())
            inblock = not inblock
        elif inblock and line.startswith("- ["):
            tmp.append(line.rstrip())
        else:
            if len(tmp) > 0:
                res.append("\n".join(tmp))
                tmp = []
                inblock = not inblock
    

    请参阅 Python demo online 。基本上,一旦找到 **HEADERONE** ,所有以 - [ 开头的后续行都会附加到 tmp ,然后加入 res 列表中的一个项目。

    关于python - 正则表达式匹配到以 `- [` 开头的最后一行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51216402/

    10-10 03:23