Как убрать текст между двумя двойными скобками в Python - PullRequest
1 голос
/ 31 марта 2020

У меня есть особая потребность в разборе и реструктуризации строк в Python. Это очень похоже на другие вопросы Stackoverflow, но со мной. Я провел обширный поиск, и хотя я могу приблизиться, я просто не могу понять, как сделать то, что мне нужно.

В качестве обзора я беру некоторую уценку, превращая ее в html, затем анализирую текст без тегов, чтобы у меня остался только чистый набор букв c.

Проблема в том, что уценка имеет некоторые пользовательские компоненты, из-за которых у меня возникают проблемы с анализом.

Вот пример:

{{< custom type="phase1" >}}
    Some Text in here (I want to keep this)
{{< /custom >}}

Я хочу иметь возможность удалять все, что находится в скобках {{&}} (включая скобки), сохраняя текст между первый и второй экземпляр. По сути, я просто хочу иметь возможность удалить все экземпляры {{*? }} в файле. В данном файле может быть любое число.

Вот что я попробовал:

def clean_markdown(self, text_string):
  html = markdown.markdown(text_string)
  soup = BeautifulSoup(html, features="html.parser")
  # to_extract = soup.findAll('script') //Tried to extract via soup but no joy as not tags
  cleaned = re.sub(r'([^-.\s\w])+', '', soup.text)
  return cleaned

Это работает хорошо для всего в уценке, за исключением того, что оставляет значение в тексте, который является между {{ & }}. Итак, в этом случае слово «обычай» будет в моем очищенном тексте, но я не хочу, чтобы оно было.

Как вы можете видеть, я пытался извлечь с помощью красивого супа, но это не так работать как начальное значение ({{) отличается от конечного значения (}})

У кого-нибудь есть идеи, как эффективно реализовать синтаксический анализатор в Python, который бы это очистил?

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Использование соответствия регулярному выражению должно работать хорошо:

def clean_markdown(self, text_string):
    html = markdown.markdown(text_string)
    soup = BeautifulSoup(html, features="html.parser")
    # to_extract = soup.findAll('script') //Tried to extract via soup but no joy as not tags
    match = re.match("{{.+}}\n(?P<text>.*)\n{{.+}}", soup.text, re.MULTILINE)
    cleaned = match.groupdict()['text']
    return cleaned
1 голос
/ 31 марта 2020

IIU C: Попробуйте это:

result = re.sub(r"\{\{.*?\}\}", "", string).strip()
print(result)

Выход:

Some Text in here (I want to keep this)
1 голос
/ 31 марта 2020

Если я понимаю, что вы пытаетесь сделать правильно, вы сможете использовать re.sub для замены всех шаблонов {{...}} пустой строкой непосредственно в параметре text_tring

def clean_markdown(self, text_string): 
    return re.sub("{{.*}}","",text_string)
...