regex 创建正则表达式以从Markdown提取代码的问题

cfh9epnr  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(102)

我正在尝试从一串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('foobarfoo')
print('foobarfoo')
`


您会注意到我遇到的唯一问题是代码块末尾的额外反勾号。我不知道是什么匹配的,也不知道如何删除它,但我确信这与我使用的消极前瞻有关。
mlnl4t2r

mlnl4t2r1#

第一个不匹配.*````的字符(因此终止匹配)是print('foobarfoo')`之后行开头的```。例如this demo。您将注意到,当存在多个代码块时,此方法根本不起作用。
也许最安全的方法是依靠作为第一个上线。然后你可以匹配到下一个出现在一行的开头:

^```(?:\w+)?\s*\n(.*?)(?=^```)```

Demo on regex101
在python中:

import re

string = """
Lorem ipsum
```python
print('foo```bar```foo')
print('foo```bar```foo')

Lorem ipsum

print('foo```bar```foo')
print('foo```bar```foo')

Lorem ipsum

print('foo```bar```foo')
print('foo```bar```foo')

"""

pattern = r'^(?:\w+)?\s*\n(.*?)(?=^)```'
result = re.findall(pattern, string, re.DOTALL | re.MULTILINE)
print(*[r for r in result], sep='\n')


输出:

print('foobarfoo')
print('foobarfoo')

print('foobarfoo')
print('foobarfoo')

print('foobarfoo')
print('foobarfoo')

相关问题