Regex для извлечения #hashtags из метаданных MMD в Python
Я пытаюсь извлечь все #hashtags из строки "Tags: #tag1 #tag2" в виде открытого текста с несколькими уценками. (Я нахожусь в многострочном режиме Python.)
Я пытался использовать lookaheads:
^(?=Tags:\s.*)#(\w+)\b
и смотреть за
#(\w+)\b(?<=Tags:^\s)
Обычная ваниль #(\w+)\b
работает, за исключением того, что получает любой #hashtag, который может появиться позже в документе.
Любые советы, помощь, инструкция приветствуется.
2 ответа
Решение
text = "\n\n#bogus\nTags: #foo #bar\n"
Во-первых, вам нужно получить строку:
line = re.findall(r'Tags:.+\n', text)
# line = ['Tags: #foo #bar\n']
Наконец, вам нужно получить теги из строки:
tags = re.findall(r'#(\w+)', line[0])
# tags = ['foo', 'bar']
tags = re.findall(r'#\w+', line[0])
# tags = ['#foo', '#bar']
Lookbehind не будет работать, так как вам нужно будет предоставить шаблон, который не имеет фиксированной ширины.
Сначала получите индекс, где хеш находится во входном тексте, а затем используйте re.findall для получения повторных захватов. Следующий пример печатает ['#tag1', '#tag2']
text = "Tags: #tag1 #tag2"
matched = re.search(r'^Tags([^#]+)', text)
if matched:
tag_text = text[matched.end():]
hash_tags = re.findall(r'(#(?:[^#\s]+(?:\s*?)))', tag_text)
print hash_tags