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

2024-10-06 10:34:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我想储存'LS003942\U 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: expected string or bytes-like object.

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


Tags: 字符串projectfieldsnewtitlesaplacerandom
3条回答

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

说明:它使用正向lookback来确保匹配发生在'Project Title':之后。然后匹配,直到遇到}[^}]+。你知道吗

Demo

可以使用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。你知道吗

我认为你不需要这里的regex

string = "{'Project Title': 'LS003942_EP - 5 Random Road, Sunny Place, SA 5000'}"
foldername = string[string.index(":") + 2: len(string)-1]

基本上,我要找到第一个冒号的位置,然后加2得到foldername的起始索引(这将是撇号),然后我使用索引切片,从索引到最后的第二个字符(最后一个撇号)进行切片。你知道吗

但是,如果您的字符串总是以有效的python dict的形式出现,您只需执行foldername = (eval(string).values)[0]。这里,我将您的字符串视为dict,并从中获取第一个值,这是您所需的foldername。但是,正如@AKX在注释中所指出的,eval()是不安全的,因为有人可以将恶意代码作为字符串传递。除非您确定您的输入字符串不会包含代码(这是不可能的),否则最好使用评估()因为它只计算文本。你知道吗

但是,正如@MaximilianPeters在评论中指出的那样,您的响应看起来像是一个有效的JSON,因此您可以使用json.parse()轻松解析它。

相关问题 更多 >