使用python中的模式匹配在字符串中查找字符串

时间:2018-08-06 08:15:31

标签: python regex string

我想使用从API返回的字符串(“项目”)的一部分。字符串如下所示:

{'Project Title': 'LS003942_EP - 5 Random Road, Sunny Place, SA 5000'}

我想将'LS003942_EP ...'部分存储在名为foldername的新变量中。我认为一种好方法是使用正则表达式在Title之后查找文本。这是我的代码:

orders = api.get_all(view='Folder', fields='Project Title', maxRecords=1)
for new in orders:
    print ("Found 1 new project")
    print (new['fields'])
    project = (new['fields'])
    s = re.search('Title(.+?)', result)
    if s:
       foldername = s.group(1)
       print(foldername)

这给我一个错误-

  

TypeError:预期的字符串或类似字节的对象。

我希望有foldername = 'LS003942_EP - 5 Random Road, Sunny Place, SA 5000'

3 个答案:

答案 0 :(得分:0)

我认为您不需要在这里使用build_dir

regex

基本上,我要找到第一个冒号的位置,然后加2以获取文件夹名称的起始索引(即单引号),然后使用索引切片并将从索引到第二个的所有内容切片-最后一个字符(最后一个撇号)。

但是,如果您的字符串始终以有效的Python string = "{'Project Title': 'LS003942_EP - 5 Random Road, Sunny Place, SA 5000'}" foldername = string[string.index(":") + 2: len(string)-1] 的形式出现,则只需执行dict。在这里,我将您的字符串视为foldername = (eval(string).values)[0],并从中获取第一个值,即您想要的dict。但是,正如@AKX在评论中指出的那样,foldername是不安全的,因为有人可以将恶意代码作为字符串传递。除非您确定输入字符串中不包含代码(这不太可能),否则最好使用ast.literal_eval(),因为它仅计算文字。

但是,正如@MaximilianPeters在评论中指出的那样,您的回复看起来像是有效的JSON,因此您可以轻松地使用eval()对其进行解析。

答案 1 :(得分:0)

您可以使用ast.literal_eval安全地评估包含Python文字的字符串:

import ast

s = "{'Project Title': 'LS003942_EP - 5 Random Road, Sunny Place, SA 5000'}"

print(ast.literal_eval(s)['Project Title'])
# LS003942_EP - 5 Random Road, Sunny Place, SA 5000

(在我看来)您有字典而不是字符串。考虑到这种情况,您可以尝试:

s = {'Project Title': 'LS003942_EP - 5 Random Road, Sunny Place, SA 5000'}

print(s['Project Title'])

如果有时间,请看看dictionaries

答案 2 :(得分:0)

您可以尝试以下模式:(?<='Project Title': )[^}]+

说明:它使用正向后方保证,匹配将在'Project Title':之后发生。然后匹配,直到遇到}[^}]+

Demo