Текст соответствия RegEx между разделителями - PullRequest
1 голос
/ 21 апреля 2020

Немного сложнее, чем вы могли бы сначала представить.
У меня есть текстовый документ, написанный на Markdown, и мне нужно удалить первый раздел H1:

# H1 Header  - delete
## H2 Header  - delete
### H3 Header - delete  

# H1 Header - start here  

Игнорирование остальной части сценарий python на данный момент, я считаю, что мои проблемы ie из-за моего непонимания взглядов вперед / назад. Изо всех сил пытаясь разобраться в этом ...
Это выбор того, что я пробовал до сих пор (пробовал много разных способов):

content = re.sub("#(?!#).*?#(?!#)",'',content, flags=re.MULTILINE | re.DOTALL)
content = re.sub("# .*?#(?!#)",'',content, flags=re.MULTILINE | re.DOTALL)

По сути, мне нужно заменить содержимое между # и # без совпадения для нескольких одинаковых символов #, таких как ## или ###.
Любая помощь с RegEx для этого приветствуется.

1 Ответ

1 голос
/ 21 апреля 2020

Вы можете использовать

(?s)(?<!#)#(?!#).*?(?=(?<!#)#(?!#))
(?<!#)#(?!#)[\s\S]*?(?=(?<!#)#(?!#))

См. Демоверсию regex . Вам не нужно (?s), если вы используете опцию re.S или re.DOTALL.

Подробности

  • (?<!#)#(?!#) - # не сразу ни перед, ни с последующими # символами
  • .*? - любые 0+ символов, как можно меньше
  • (?=(?<!#)#(?!#)) - положительный прогноз, требующий # символа, непосредственно не предшествующего ни затем # символов непосредственно справа от текущего местоположения.

В Python, используйте

text = re.sub(r'(?<!#)#(?!#).*?(?=(?<!#)#(?!#))', '', text, 1, re.S)

, где re.sub занимает шаблон в качестве первого аргумента, замена (это пустая строка после удаления) в качестве второго аргумента, текст в качестве третьего аргумента, число замен в качестве четвертого и модификаторы в качестве последнего аргумент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...