Попытка сопоставить '#' в тексте - PullRequest
1 голос
/ 30 июня 2010

Я пытаюсь сопоставить «#», за которым следуют буквы, если и только если ему предшествует символ новой строки, пробел или первый символ в строке.Первые два я сделал, но мне сложно найти соответствие, если это первый символ в строке.Я пытаюсь найти применение для '\ A', но не получается просто добавить его в класс, содержащий символы новой строки и пробелы.Что я пропустил?

Регулярное выражение, которое я до сих пор придумал:

from re import findall, escape
from string import punctuation, whitespace

NEWLINE = """\r\n?|\n"""
INVALID_TAG_CHARACTERS = escape(punctuation.replace('-', '').replace('_', '') + whitespace)
VALID_TAGS = r'[\s%s]+#[^%s]+' % (NEWLINE, INVALID_TAG_CHARACTERS)
tags = findall(VALID_TAGS, text)

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

Я думаю, это то, что вы ищете:

result = re.findall("(?:^|\s)(#[a-zA-Z]+)", text, re.MULTILINE)

(?: ^ | \ S) - это набор не группирующих скобок (мы не хотим, чтобы эта часть былаРезультаты).С многострочным флагом он будет соответствовать началу строки или предшествующей новой строке или пробелу.Следующая группа - твой «тег», я верю.Если это не буквы после знака #, вам придется возиться с этой второй группой.

1 голос
/ 30 июня 2010

Включите многострочный флаг, чтобы ^ соответствовал позиции после новой строки, затем просто используйте:

re.compile(r"(?m)^\s*#") # includes the flag for multi-line

или

re.compile(r"(?m)^\s*#.*$")

, чтобы получить полную строку (с отключенным режимом перевода строки в точку).

Для «первого символа в строке» это зависит от того, как определяется строка - для этого вам может потребоваться использовать полный синтаксический анализатор, а не один регулярное выражение.

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