用于在tweet开头匹配Twitter用户名的Python正则表达式
我有这样一条推文:用于在tweet开头匹配Twitter用户名的Python正则表达式,python,regex,Python,Regex,我有这样一条推文: "@user1 @user2 blablabla @user3" 我想使用正则表达式在tweet的开头过滤用户。这意味着@user1和@user2。并不总是有相同数量的用户,可能有一个,两个,三个 我正在用re.IGNORECASE尝试这个: re.compile(ur'^(@[a-z0-9_]*\s)*') 但不符合我想要的,我已经尝试了所有我想到的,但失败了。我对Python正则表达式不是很熟悉,但我将如何使用egrep: echo "@user1 @user2 bl
"@user1 @user2 blablabla @user3"
我想使用正则表达式在tweet的开头过滤用户。这意味着@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)
您的egrep版本将
*
应用于单词之间的空格,但Python版本没有。而且,\s
匹配所有空格,而不仅仅是空格;如果不需要正则表达式,则[a-zA-Z0-9\]
(即[a-Z0-9\]
带有re.IGNORECASE
,因为该标志实际上不影响任何其他内容)更容易拼写\w
:
>>> 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']
尝试以下正则表达式:
^(@\w++\s)+
在@user1@user2 blabla@user3
中,它将匹配:
不带
re
,但带itertools
:
>>> tw = "@user1 @user2 blablabla @user3"
>>> import itertools
>>> list(itertools.takewhile(lambda x: x.startswith('@'), tw.split()))
['@user1', '@user2']
这应该有效(如果要删除它们:
>>> t = "@user1 @user2 blablabla @user3"
>>> re.compile("^(?:@\w+\s+)*(.*)$").match(t).group(1)
'blablabla @user3'
>>>
或者(如果您只想获取用户):
你能举个例子说明哪些不应该匹配,哪些不应该匹配吗?在我提到的tweet文本中,我想匹配
@user1
@user2
,而@user3
不匹配。我在上面提到过。现在你已经解释了你希望发生的事情。你使用的解决方案实际会发生什么e到目前为止是否尝试过?我刚刚发现正则表达式是正确的,但我的问题是我使用groups()
函数检查结果,而不是group(0)
。很抱歉,我没有正确地解释自己。我提出了与您在第一个示例中提到的解决方案几乎相同的解决方案,但我感到迫切需要找到正确的正则表达式,不过这是针对个人的,谢谢。我明白您的意思,但上面的Python正则表达式不起作用,即使我将其翻译为:ur'^(@\w\s*)*“
对不起,正则表达式是对的,我只是检查了错误的结果。谢谢你的提示。这应该是\w*
;而(…)
也给你带来了问题,因为正则表达式的组将只显示最后一个匹配项。请尝试使用非捕获括号,即(?:…)
。谢谢,我明白你的意思。我对非捕获括号一无所知。如果tweet是例如@user1,blablablabla
这是一条有效的tweet,你会得到['@user1',]
>>> re.compile("^((?:@\w+\s+)*)$").match(t).group(1).split()
['@user1', '@user2']
>>>