Я очень неопытный кодировщик Python, поэтому вполне возможно, что я подхожу к этой конкретной проблеме совершенно неправильно, но я был бы признателен за любые предложения / помощь.
У меня есть Python, который последовательно просматривает файл Markdown и перезаписывает [[wikilinks]]
как стандартные ссылки в стиле Markdown [wikilink](wikilink)
. Я делаю это, используя два регулярных выражения в одной функции, как показано ниже:
def modify_links(file_obj):
"""
Function will parse file contents (opened in utf-8 mode) and modify standalone [[wikilinks]] and in-line
[[wikilinks]](wikilinks) into traditional Markdown link syntax.
:param file_obj: Path to file
:return: List object containing modified text. Newlines will be returned as '\n' strings.
"""
file = file_obj
linelist = []
logging.debug("Going to open file %s for processing now.", file)
try:
with open(file, encoding="utf8") as infile:
for line in infile:
linelist.append(re.sub(r"(\[\[)((?<=\[\[).*(?=\]\]))(\]\])(?!\()", r"[\2](\2.md)", line))
# Finds references that are in style [[foo]] only by excluding links in style [[foo]](bar).
# Capture group $2 returns just foo
linelist_final = [re.sub(r"(\[\[)((?<=\[\[)\d+(?=\]\]))(\]\])(\()((?!=\().*(?=\)))(\))",
r"[\2](\2 \5.md)", line) for line in linelist]
# Finds only references in style [[foo]](bar). Capture group $2 returns foo and capture group $5
# returns bar
except EnvironmentError:
logging.exception("Unable to open file %s for reading", file)
logging.debug("Finished processing file %s", file)
return linelist_final
Это отлично работает для большинства файлов Markdown. Однако иногда я могу получить файл Markdown, который содержит [[wikilinks]]
внутри изолированных блоков кода, например:
# Reference
Here is a reference to “the Reactome Project” using smart quotes.
Here is an image: ![](./images/Screenshot.png)
[[201802150808]](Product discovery)
```
[[201802150808 Product Prioritization]]
def foo():
print("bar")
```
В приведенном выше случае я должен пропустить обработку [[201802150808 Product Prioritization]]
внутри изолированного блока кода. У меня есть регулярное выражение, которое правильно идентифицирует огороженный блок кода, а именно:
(?<=```)(.*?)(?=```)
Однако, поскольку существующая функция работает построчно, я не смог найти способ пропустить весь раздел в для l oop. Как мне go об этом?