我有这样的推文:
"@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)
答案 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
中,它将匹配:
答案 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']
>>>