1

我正在研究一个正则表达式,它将从推文中提取转推关键字和用户名。这是一个例子,用一个相当糟糕的正则表达式来完成这项工作:

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 被拾取。)

任何帮助是极大的赞赏。谢谢。

4

1 回答 1

3

尝试

(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])

要获得单独的句柄?

于 2009-03-17T20:35:38.417 回答