用于在推文开头匹配Twitter用户名的Python正则表达式

时间:2011-08-14 14:55:48

标签: python regex

我有这样的推文:

"@user1 @user2 blablabla @user3"

我想使用正则表达式在推文开头过滤用户。这意味着@ user1和@ user2。并不总是有相同数量的用户,可能有一个,两个,三个......

我正在尝试使用re.IGNORECASE:

re.compile(ur'^(@[a-z0-9_]*\s)*')

但是与我想要的不符,我已经尝试了所有我想出来的,但都失败了。我对Python正则表达式不是很熟悉,但我会用egrep:

来做这件事
echo "@user1 @user2 blablabla @user3" | egrep '^(@[[:alnum:]_]*[ ]*)*'

由于

修改

正则表达式是正确的,我只是以错误的方式检查解决方案。

tweet = "@user1 @user2 blablabla @user3"
re.compile(ur'^(@[a-z0-9_]*\s)*').match(tweet).groups()

而不是:

re.compile(ur'^(@[a-z0-9_]*\s)*').match(tweet).group(0)

正则表达式的更清晰版本:

re.compile(ur'^(@\w+\s)+').match(tweet).group(0)

5 个答案:

答案 0 :(得分:5)

没有re,但有itertools

>>> tw = "@user1 @user2 blablabla @user3"
>>> import itertools
>>> list(itertools.takewhile(lambda x: x.startswith('@'), tw.split()))
['@user1', '@user2']

答案 1 :(得分:2)

试试这个正则表达式:^(@\w+\s)+

@user1 @user2 blablabla @user3中,它将匹配:

enter image description here

答案 2 :(得分:1)

您的egrep版本会在单词之间的空格中应用*,但您的Python版本不会。此外,\s匹配所有空格,而不仅仅是空格;和[a-zA-Z0-9_](即[a-z0-9_]re.IGNORECASE,因为该标志不会影响其他任何内容)更容易拼写\w

答案 3 :(得分:1)

如果没有必要使用正则表达式:

>>> tweet = "@user1 @user2 blablabla @user3"
>>> s = tweet.split()
>>> s[:next(pos for pos, i in enumerate(s) if not i.startswith("@"))]
['@user1', '@user2']

使用循环的更简单,更传统的方法:

>>> tweet = "@user1 @user2 blablabla @user3"
>>> users = []
>>> for i in tweet.split():
...     if i.startswith("@"):
...         users.append(i)
...     else:
...         break
... 
>>> users
['@user1', '@user2']

答案 4 :(得分:0)

这应该有效(如果你想删除它们:

>>> t = "@user1 @user2 blablabla @user3"
>>> re.compile("^(?:@\w+\s+)*(.*)$").match(t).group(1)
'blablabla @user3'
>>> 

或者这个(如果你只想获得用户):

>>> re.compile("^((?:@\w+\s+)*)$").match(t).group(1).split()
['@user1', '@user2']
>>>