Python 试图匹配'#';在文本中

Python 试图匹配'#';在文本中,python,regex,Python,Regex,我试图匹配“#”后跟字母的当且仅当它前面有换行符、空格或是字符串中的第一个字符时。前两个我已经做了,但是如果它是字符串中的第一个字符,我很难匹配。我正试图找到“\a”的用法,但仅将其添加到包含换行符和空格的类中是行不通的。我错过了什么 到目前为止,我提出的正则表达式是: from re import findall, escape from string import punctuation, whitespace NEWLINE = """\r\n?|\n""" INVALID_TAG_CH

我试图匹配“#”后跟字母的当且仅当它前面有换行符、空格或是字符串中的第一个字符时。前两个我已经做了,但是如果它是字符串中的第一个字符,我很难匹配。我正试图找到“\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)

启用多行标志,使
^
匹配换行后的位置,然后只需使用:

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

获取完整行(禁用点匹配换行模式)。


对于“字符串中的第一个字符”,这取决于字符串的定义-您可能需要为此使用完整的解析器,而不是单个正则表达式。

我认为这就是您要寻找的:

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

(:^ |\s)是一组非分组括号(我们不希望在结果中包含这一部分)。使用多行标志时,它将匹配字符串的开头,或前面的换行符或空格。我相信下一组是你的“标签”。如果不是跟在#后面的字母,你就得摆弄第二组。

ah漏掉了“字符串位中的第一个字符”。。。我已经编辑了答案,将其包括在内,但不确定它是否非常有用:S
^
它不匹配换行符,而是匹配换行符和下一个字符之间的假想间隙(即多行模式)。你可能已经知道了,但我不能让这句话不受质疑。好的一点是,
^
$
匹配位置是一个重要的区别,而不是使用实际字符。这两行似乎都不起作用。:-/但是谢谢你给我介绍多行。:-)这很有魅力,谢谢!:-)我不得不将其更改为“(?:^^\s)(#[^%s]+)%INVALID_TAG_CHARACTERS”。@MdaG,您可能需要使用
re.escape(INVALID_TAG_CHARACTERS)
来确保您不会意外地将regex特殊字符注入到您的模式中。原始帖子中的转义还不够吗?i、 e.)无效的标记字符=转义(标点符号。替换('-','')。替换(''','')+空格)
result = re.findall("(?:^|\s)(#[a-zA-Z]+)", text, re.MULTILINE)