用于转发的python正则表达式

用于转发的python正则表达式,python,regex,twitter,Python,Regex,Twitter,我正在开发一个正则表达式,可以从推文中提取转发关键词和用户名。下面是一个例子,其中有一个非常糟糕的正则表达式: 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*模

我正在开发一个正则表达式,可以从推文中提取转发关键词和用户名。下面是一个例子,其中有一个非常糟糕的正则表达式:

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*
模式,使它们成为一个可变的数字,这样,如果在@three之后添加@four,它也会被提取出来。我尝试了许多排列,用
+
重复这一点,但都没有成功

我也希望它能为类似的东西工作

tweet='foobar RT@one, RT @two: RT @three barfoo';
如果模式不重叠,可以使用re.finditer实现。(我有一个模式重叠的版本,因此只拾取第一个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])

要获取单个句柄?

感谢您的快速回复!不幸的是,这似乎不起作用,除非我输入了错误的东西:tweet='foobarRT@one,@two:@three barfoo'm=re.search(r'(RT | retweet | from | via)(?:\b\W*@(\W+)+),tweet)m.groups()('RT',three'),但我将继续阅读(?:…)。谢谢,谢谢马库斯。基本上,我最终使用了类似的方法,但由于无法找到一个单正则表达式的解决方案而感到困扰。谢谢。我想这里已经回答了这个问题:Nm,它只是部分回答,因为这里对RT/retweet的要求,很抱歉。感谢您传递这个信息——虽然只是部分回答,但绝对有用!