我正在尝试匹配“#”后跟字母,当且仅当它前面有换行符,空格或字符串中的第一个字符时。前两个我已经完成了,但是如果它是字符串中的第一个字符,我很难匹配。我正在尝试找到'\ 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)
答案 0 :(得分:2)
我认为这就是你要找的东西:
result = re.findall("(?:^|\s)(#[a-zA-Z]+)", text, re.MULTILINE)
(?:^ | \ s)是一组非分组括号(我们的结果中不需要这部分)。使用多行标志,它将匹配字符串的开头,或前一个换行符或空格。我相信下一组是你的'标签'。如果它不是#之后的字母,你将不得不摆弄第二组。
答案 1 :(得分:1)
启用多行标记,以便^
匹配换行符后的位置,然后使用:
re.compile(r"(?m)^\s*#") # includes the flag for multi-line
或
re.compile(r"(?m)^\s*#.*$")
获取整行(禁用点匹配换行模式)
对于“字符串中的第一个字符”,这取决于字符串的定义 - 您可能需要使用完整的解析器,而不是单个正则表达式。