行首的可选匹配

时间:2012-09-26 20:48:06

标签: python regex hashtag

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

  • 这是一项以#
  • 开头的作品
  • 它可以包含除[ ,\.]
  • 之外的所有字符
  • 它可以在文本的任何地方

所以在本文中

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

此处的哈希值为Thisfouronlyhashtags

我遇到的问题是可选检查行的开头。

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

示例+

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']

可选项如何匹配行的开头?

2 个答案:

答案 0 :(得分: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正好相反,因此也需要LOCALEUNICODE的设置。
  • \W :未指定LOCALEUNICODE标志时,匹配任何非字母数字字符;这相当于集合[^a-zA-Z0-9_]。使用LOCALE,它将匹配集合[0-9_]中没有的任何字符,并且不会定义为当前区域设置的字母数字。如果设置了UNICODE,则除了[0-9_]以外的其他任何内容以及Unicode字符属性数据库中不是字母数字的字符。

答案 1 :(得分:0)

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

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

负面观察可以做到这一点