2015-04-17 176 views
4

首先,我知道这可能似乎例如重复的问题,但是,我找不到任何工作解决我的问题。Python的正则表达式获取字符串两个子串之间

我有字符串,如下所示:

string = "api('randomkey123xyz987', 'key', 'text')" 

我需要提取randomkey123xyz987这将永远是API之间( '',

我打算使用正则表达式这一点,但是,我似乎遇到了一些麻烦。

这是唯一的进步是我取得:

import re 
string = "api('randomkey123xyz987', 'key', 'text')" 
match = re.findall("\((.*?)\)", string)[0] 
print match 

下面的代码返回'randomkey123xyz987', '键',

我曾尝试使用 '文本' [^'],但我的猜测是,我没有正确地将它插入到re.findall函数中。我试图

一切都是失败的。


更新:我目前的解决方法是使用[2:-4],但我还是想尽量避免使用匹配[2:-4]

回答

3

如果字符串只包含一个实例,使用re.search()代替:

>>> import re 
>>> s = "api('randomkey123xyz987', 'key', 'text')" 
>>> match = re.search(r"api\('([^']*)'", s).group(1) 
>>> print match 
randomkey123xyz987 
0

你想要(,之间的字符串,正赶上括号之间的一切:''之间的匹配

match = re.findall("api\((.*?),", string) 

print match 
["'randomkey123xyz987'"] 

或者:

match = re.findall("api\('(.*?)'", string) 
print match 
['randomkey123xyz987'] 

如果这是你的琴弦实际上是如何看你可以分割:

string = "api('randomkey123xyz987', 'key', 'text')" 

print(string.split(",",1)[0][4:]) 
0

您应该使用正则表达式如下:

api\('(.*?)' 

假设api(是固定的前缀

它匹配api(,然后捕获接下来会出现,直到'令牌。

>>> re.findall(r"api\('(.*?)'", "api('randomkey123xyz987', 'key', 'text')") 
['randomkey123xyz987'] 
0

如果您确信randomkey123xyz987总是会之间的“API(“”和“”,”,然后使用split()方法可以得到它在同一行完成的。这样你就不必使用正则表达式匹配,这将匹配的开始和结束分隔符是“API(“”和“”, ”的格局。

>>> string = "api('randomkey123xyz987', 'key', 'text')" 
>>> value = (string.split("api('")[1]).split("',")[0] 
>>> print value 
randomkey123xyz987 
相关问题