簡體   English   中英

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

[英]Find a string within a string using pattern matching in python

我想使用從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'

我認為您不需要在這里使用regex

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

本質上,我要找到第一個冒號的位置,然后添加2以獲取文件夾名稱的起始索引(即單引號),然后使用索引切片並對從索引到倒數第二個字符的所有內容進行切片(最后一個撇號)。

但是,如果您的字符串始終采用有效的python dict形式,則可以簡單地執行foldername = (eval(string).values)[0] 在這里,我將您的字符串當作dict並從中獲取第一個值,即您所需的foldername 但是,正如@AKX在注釋中指出的那樣, eval()並不安全,因為有人可以將惡意代碼作為字符串傳遞。 除非您確定輸入字符串不包含代碼(這不太可能),否則最好使用ast.literal_eval(),因為它僅計算文字。

但是,正如@MaximilianPeters在評論中指出的那樣,您的響應看起來像是有效的JSON,因此您可以使用json.parse()輕松解析它。

您可以使用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'])

如果有時間,請看一下詞典

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

說明:它使用正向后方保證,匹配將在'Project Title': 然后匹配,直到遇到}[^}]+

演示版

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM