首页 > 解决方案 > 正则表达式匹配以 `- [` 开头的最后一行

问题描述

我有一个指定的主体块,其中包含一个 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  

我可以在抓取后以编程方式截断字符串,但我很好奇是否有一种非常干净的方式来抓取我的列表?标题总是相同的,所以从**HEADERONE**双新行的第一个实例开始抓取就可以了。不过,从最后一行抓取**HEADERONE**到最后一行- [将是惊人的。

我正在使用

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

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

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

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

标签: pythonregexstringpython-3.xsubstring

解决方案


您可以使用以下内容找到\*\*HEADERONE\*\*第一个空行之间的所有内容:

^(\*\*HEADERONE\*\*[\s\S]*?)^\s*$

演示

[\s\S]*?匹配所有字符,包括换行符,直到第一个空行。如果有可能没有空行或字符串结尾,您可以轻松地将该测试添加到表单中:

^(\*\*HEADERONE\*\*[\s\S]*?)(?:^\s*$|\Z)

演示


如果您想使用 Python 非正则表达式来获取该块,并且这些块由两个或更多新行分隔,您可以执行以下操作:

print('\n'.join(block for block in s.replace('\r\n', '\n').split('\n\n') if block.lstrip().startswith('**HEADERONE**')))

在线尝试

或者,如果您有文件:

print('\n'.join(block for block in fo.read() if block.lstrip().startswith('**HEADERONE**')))

fo在文件模式下打开的文件在哪里'U'


推荐阅读