2012-12-21 96 views
0

我正在寻找以@开头的子串,并以第一个\s的发生结束。 必须在字符串开头或空格后有@python正则表达式有条件lookbehind

@one bla bla bla @two @[email protected] #@five

结果@one, @two, @[email protected]

我结束了这种重:((?<=\s)|(?<=^))@[^\s]+它工作在崇高的文本2罚款,但在Python返回空字符串。

Python代码

re.findall(r'((?<=^)|(?<=\s))@[^\s]+', '@one bla bla bla @two @[email protected] #@five') 
+0

你如何使用这个表达式在Python? – Blender

+0

你不需要在第一个分支倒序。 '^'已经是一个零宽度的断言。 –

回答

0

你捕获组不捕捉,你真正需要的文字:

(?:(?<=^)|(?<=\s))(@[^\s]+) 

现在,它的工作原理:

>>> re.findall(r'(?:(?<=^)|(?<=\s))(@[^\s]+)', '@one bla bla bla @two @[email protected] #@five') 
['@one', '@two', '@[email protected]'] 
+0

值得一提的是,这种行为的原因是,如果捕获组存在,'findall'会返回它们而不是返回整个匹配(即使它*在没有组时返回整个匹配)。这是记录,但它似乎总是让人惊讶。 – BrenBarn

+0

@BrenBarn:呃,我不知道。谢谢。 – Blender

+0

是的。那工作。非常感谢 – qubblr

2

如果你愿意不使用reg expr,你可以试试:

>>> s ="@one bla bla bla @two @[email protected] #@five" 
>>> filter(lambda x:x.startswith('@'), s.split()) 
['@one', '@two', '@[email protected]'] 

这实际上要快很多......

+0

太棒了!这个解决方案实际上工作速度快了2倍 – qubblr