试图在文本中匹配“#”

时间:2010-06-30 15:41:29

标签: python regex

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

答案 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*#.*$")

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

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