当然,上述所有评论者都是正确的:单词之间没有空格或其他明确分隔符的主题标签(尤其是英语)通常是不明确的,并且在所有情况下都无法正确解析。
然而,单词列表的想法实现起来相当简单,并且可能会产生有用的(尽管有时是错误的)结果,所以我实现了一个快速版本:
wordList = '''awesome day of my life because i am great something some
thing things unclear sun clear'''.split()
wordOr = '|'.join(wordList)
def splitHashTag(hashTag):
for wordSequence in re.findall('(?:' + wordOr + ')+', hashTag):
print ':', wordSequence
for word in re.findall(wordOr, wordSequence):
print word,
print
for hashTag in '''awesome-dayofmylife iamgreat something
somethingsunclear'''.split():
print '###', hashTag
splitHashTag(hashTag)
这打印:
### awesome-dayofmylife
: awesome
awesome
: dayofmylife
day of my life
### iamgreat
: iamgreat
i am great
### something
: something
something
### somethingsunclear
: somethingsunclear
something sun clear
正如你所看到的,它落入了 qstebom 为它设置的陷阱;-)
EDIT:
对上面代码的一些解释:
变量wordOr
包含所有单词的字符串,由管道符号分隔(|
)。在正则表达式中,这意味着“这些单词之一”。
首先findall
获取一个模式,表示“一个或多个这些单词的序列”,因此它与“dayofmylife”之类的内容匹配。这findall
找到所有这些序列,所以我迭代它们(for wordSequence in …
)。对于每个单词序列,然后我搜索每个单词(也使用findall
)在序列中并打印该单词。