我正在尝试在Python中创建一个匹配#hashtags的正则表达式。我对主题标签的定义是:
#
[ ,\.]
所以在本文中
#This string cont#ains #four, and #only four #hashtags.
此处的哈希值为This
,four
,only
和hashtags
。
我遇到的问题是可选检查行的开头。
[ \.,]+
不会这样做,因为它与可选的开头不匹配。[ \.,]?
因为匹配太多而不会这样做。示例+
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']
可选项如何匹配行的开头?
答案 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
正好相反,因此也需要LOCALE
和UNICODE
的设置。\W
:未指定LOCALE
和UNICODE
标志时,匹配任何非字母数字字符;这相当于集合[^a-zA-Z0-9_]
。使用LOCALE,它将匹配集合[0-9_]
中没有的任何字符,并且不会定义为当前区域设置的字母数字。如果设置了UNICODE
,则除了[0-9_]
以外的其他任何内容以及Unicode字符属性数据库中不是字母数字的字符。答案 1 :(得分:0)
在你的正则表达式之前,你可以告诉你不想要的东西。
(?<!\w)(#[^ \.,]+)
负面观察可以做到这一点