Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于在tweet开头匹配Twitter用户名的Python正则表达式_Python_Regex - Fatal编程技术网

用于在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']
>>>