我正在开发一个正则表达式,它将从推文中提取转发关键字和用户名。这是一个例子,用一个相当糟糕的正则表达式来完成这项工作:
tweet='foobar RT@one, @two: @three barfoo'
m=re.search(r'(RT|retweet|from|via)\b\W*@(\w+)\b\W*@(\w+)\b\W*@(\w+)\b\W*',tweet)
m.groups()
('RT', 'one', 'two', 'three')
我想要的是压缩重复的
\b\W*@(\w+)\b\W*
模式并使它们成为一个可变的数字,这样如果@four被添加到@ Three之后,它也会被提取。我尝试了很多排列来用 +
重复此操作,但没有成功。
我也希望它能用于类似的事情
tweet='foobar RT@one, RT @two: RT @three barfoo';
这可以通过重新查找器来实现如果图案不重叠。 (我有一个版本,其中模式确实重叠,因此只有第一个 RT 被拾取。)
非常感谢任何帮助。谢谢。
尝试
(RT|retweet|from|via)(?:\b\W*@(\w+))+'
将
\b\W*@(\w+)
括在“(?:...)”中可以让您对术语进行分组以进行重复,而无需捕获聚合。
我不确定我是否遵循了您问题的第二部分,但我认为您可能正在寻找涉及以下结构的内容:
(?:(?!RT|@).)
它将匹配任何不是“@”或“RT”开头的字符,同样不会捕获它。
那么,怎么样:
(RT|retweet|from|via)((?:\b\W*@\w+)+)
然后进行后期处理
re.split(r'@(\w+)' ,m.groups()[1])
要获取单独的句柄吗?
可以匹配大多数报告/转发/修改后的帖子的正则表达式如下。
\brt\b|#retweet|#modifiedpost|via @|\bmp\b|@\w*:|#rt|#mp|(rt|mt):? @\w*:?|
像这样的东西应该可以抓住他们。
其他相关帖子有
尝试使用正则表达式和 PHP 查找 Twitter RT 以及如何去掉转发的开头?
编辑:添加了其他回复