我正在尝试从一串Markdown中提取代码,我非常接近了。我的代码是:
import re
string = """
Lorem ipsum
```python
print('foo```bar```foo')
print('foo```bar```foo')
Lorem ipsum
"""
pattern = r'(?:\w+\n)?(.*?)(?!.*
)'
result = re.search(pattern, string, re.DOTALL).group(1)
print(result)
这样做的结果是:
print('foobar
foo')
print('foobar
foo')
`
您会注意到我遇到的唯一问题是代码块末尾的额外反勾号。我不知道是什么匹配的,也不知道如何删除它,但我确信这与我使用的消极前瞻有关。
1条答案
按热度按时间mlnl4t2r1#
第一个不匹配
.*````的字符(因此终止匹配)是
print('foobar
foo')`之后行开头的```。例如this demo。您将注意到,当存在多个代码块时,此方法根本不起作用。也许最安全的方法是依靠
作为第一个上线。然后你可以匹配到下一个
出现在一行的开头:Demo on regex101
在python中:
Lorem ipsum
Lorem ipsum
"""
pattern = r'^
(?:\w+)?\s*\n(.*?)(?=^
)```'result = re.findall(pattern, string, re.DOTALL | re.MULTILINE)
print(*[r for r in result], sep='\n')
print('foo
bar
foo')print('foo
bar
foo')print('foo
bar
foo')print('foo
bar
foo')print('foo
bar
foo')print('foo
bar
foo')