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
Другие вопросы по тегам