python上引号后的正则表达式

python上引号后的正则表达式,python,regex,Python,Regex,我正在尝试开发一个Python程序,可以从潘多拉的一个twit中获得艺术家的名字。例如,如果我有这个twitter: 我在听路德·范德罗斯在潘多拉星球上的“我能让它变得更好” 我只想把路德·范德罗斯的名字找回来。我对regex了解不多,因此我尝试执行以下代码: print re.findall('".+?" by [\w+]+', text) 但结果是路德的“我可以让它变得更好” 你知道如何在python上开发正则表达式吗?你需要使用捕获组 >>> s = '''

我正在尝试开发一个Python程序,可以从潘多拉的一个twit中获得艺术家的名字。例如,如果我有这个twitter:

我在听路德·范德罗斯在潘多拉星球上的“我能让它变得更好”

我只想把路德·范德罗斯的名字找回来。我对regex了解不多,因此我尝试执行以下代码:

print  re.findall('".+?" by [\w+]+',  text)    
但结果是路德的“我可以让它变得更好”


你知道如何在python上开发正则表达式吗?

你需要使用捕获组

>>> s = '''I'm listening to "I Can Make It Better" by Luther Vandross on Pandora #pandora http://t.co/ieDbLC393F.'''

>>> import re
>>> m = re.search('to "?(.*?)"? by (.*?) on #?Pandora', s)
>>> m
<_sre.SRE_Match object; span=(14, 69), match='to "I Can Make It Better" by Luther Vandross on P>
>>> m.groups()
('I Can Make It Better', 'Luther Vandross')
print re.findall(r'"[^"]*" by ([A-Z][a-z]+(?: [A-Z][a-z]+){0,2})',  text)  
我使用了重复量词,因为名称可能只包含名字或first、lastname或first、middle、lastname

print  re.findall('".+?" by ((?:[A-Z][a-z]+ )+)',  text)   
你可以试试这个。看演示


您可以使用此基于查找的正则表达式:

str = 'I\'m listening to "I Can Make It Better" by Luther Vandross on Pandora #pandora http://t.co/ieDbLC393F.';
print re.search(r'(?<=by ).+?(?= on)', str).group()
Luther Vandross
str='我在听《潘多拉》中路德·范德罗斯的《我能让它变得更好》http://t.co/ieDbLC393F.';

打印搜索(r’(?您的正则表达式很接近,但是您可以通过
和上的
将分隔符更改为使用
。但是,您需要使用括号来使用捕获组

您可以使用这样的正则表达式:

" by (.+?) on

这个正则表达式背后的思想是使用一个简单的非reedy正则表达式捕获
“by
on
之间的内容

匹配信息

MATCH 1
1.  [43-58] `Luther Vandross`
代码


非常感谢您的帮助=)谢谢您的帮助=),我在理解regex的工作原理时遇到了一些困难,但这个答案让我更清楚了。@Filipe很乐意帮忙。我扫描了Twitter上的#Pandora标签,找到了更多的示例,并调整了表达式,使其能够与所有这些模式一起工作。
MATCH 1
1.  [43-58] `Luther Vandross`
import re
p = re.compile(ur'" by (.+?) on')
test_str = u"I'm listening to \"I Can Make It Better\" by Luther Vandross on Pandora #pandora http://t.co/ieDbLC393F.\n"

re.search(p, test_str)