0

我正在尝试在 Python 中创建一个匹配#hashtags 的正则表达式。我对主题标签的定义是:

  • 这是一个从一个开始的作品#
  • 它可以包含所有字符,除了[ ,\.]
  • 它可以在文本中的任何位置

所以在本文中

#This string cont#ains #four, and #only four #hashtags.

这里的哈希是This,four和。onlyhashtags

我遇到的问题是对行首的可选检查。

  • [ \.,]+不会这样做,因为它与可选的开头不匹配。
  • [ \.,]?不会这样做,因为它匹配太多。

带有 + 的示例

In []: re.findall('[ \.,]+#([^ \.,]+)', '#This string cont#ains #four, and #only four #hashtags.')
Out[]: ['four', 'only', 'hashtags']

示例与?

In []: re.findall('[ \.,]?#([^ \.,]+)', '#This string cont#ains #four, and #only four #hashtags.')
Out[]: ['This', 'ains', 'four', 'only', 'hashtags']

optional 如何匹配行首?

4

2 回答 2

3

这似乎有效:

>>> re.findall(r'\B#([^,\W]+)', '#This string cont#ains #four, and #only four #hashtags.')
['This', 'four', 'only', 'hashtags']
  • \B:匹配空字符串,但仅当它不在单词的开头或结尾时。这意味着r'py\B'匹配'python', 'py3', 'py2', 但不匹配'py', 'py.', 或'py!'\B正好相反\b,所以也受制于 和 的LOCALE设置UNICODE
  • \W:未指定LOCALEandUNICODE标志时,匹配任何非字母数字字符;这相当于 set [^a-zA-Z0-9_]。使用 LOCALE,它将匹配任何不在 set 中的字符[0-9_],并且未定义为当前语言环境的字母数字。如果UNICODE设置,这将匹配[0-9_]Unicode 字符属性数据库中分类为非字母数字的加号以外的任何字符。
于 2012-09-26T20:54:37.470 回答
0

在你的正则表达式之前,你可以告诉你不想要什么。

(?<!\w)(#[^ \.,]+)

通过消极的向后看,你可以做到这一点

于 2012-09-26T20:57:17.157 回答