我有以下字符串:
x = "[(7, 'N°001C/MITP/CAB/UGP-BAD/2023 Du 30/01/2024', 'Recrutement d’une ONG/Firme pour les services d’accompagnement social,\r communication, sensibilisation des populations de la zone du projet d’Aménagement et de bitumage de la route\r Lola- Frontière de la Cote d’Ivoire', 'Sensibilisation', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 22), None, datetime.date(2024, 2, 5), 2), (9, 'N°001/MPFPV/PERSIF/UCP/2024', 'Mission d’audit des comptes du PERSIF. Exercices 2023 et 2024\r(l’audit de clôture inclus)', '', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 9), None, datetime.date(2024, 2, 5), 2)]"
这是当客户端发送请求时服务器发送给我的响应。我怎样才能将这串字符转换为可用的数据,即:
x = [(7, 'N°001C/MITP/CAB/UGP-BAD/2023 Du 30/01/2024', 'Recrutement d’une ONG/Firme pour les services d’accompagnement social,\r communication, sensibilisation des populations de la zone du projet d’Aménagement et de bitumage de la route\r Lola- Frontière de la Cote d’Ivoire', 'Sensibilisation', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 22), None, datetime.date(2024, 2, 5), 2), (9, 'N°001/MPFPV/PERSIF/UCP/2024', 'Mission d’audit des comptes du PERSIF. Exercices 2023 et 2024\r(l’audit de clôture inclus)', '', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 9), None, datetime.date(2024, 2, 5), 2)]
元组列表
您可以使用
eval
,但如果攻击者控制字符串 x,则这是不安全的:攻击者随后可以在您的计算机上运行他们选择的任何代码。使用 ast.literal_eval
是安全的,但它不支持 datetime
。
这是一个肮脏的黑客,它将
datetime.date
构造函数转换为字符串:
import ast
import datetime
import re
x = r"[(7, 'N°001C/MITP/CAB/UGP-BAD/2023 Du 30/01/2024', 'Recrutement d’une ONG/Firme pour les services d’accompagnement social,\r communication, sensibilisation des populations de la zone du projet d’Aménagement et de bitumage de la route\r Lola- Frontière de la Cote d’Ivoire', 'Sensibilisation', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 22), None, datetime.date(2024, 2, 5), 2), (9, 'N°001/MPFPV/PERSIF/UCP/2024', 'Mission d’audit des comptes du PERSIF. Exercices 2023 et 2024\r(l’audit de clôture inclus)', '', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 9), None, datetime.date(2024, 2, 5), 2)]"
if 0:
x = eval(x, {'datetime': datetime}) # Unsafe.
else:
x = re.sub(r'\b(datetime[.]date\([\d, ]+\))', r"'\1'", x) # Safe.
x = ast.literal_eval(x) # Safe.
print(x)
datetime.date
的正确解析器是可行的,但更复杂。您可以从 tokenize 模块开始:
import tokenize
x = r"[(7, 'N°001C/MITP/CAB/UGP-BAD/2023 Du 30/01/2024', 'Recrutement d’une ONG/Firme pour les services d’accompagnement social,\r communication, sensibilisation des populations de la zone du projet d’Aménagement et de bitumage de la route\r Lola- Frontière de la Cote d’Ivoire', 'Sensibilisation', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 22), None, datetime.date(2024, 2, 5), 2), (9, 'N°001/MPFPV/PERSIF/UCP/2024', 'Mission d’audit des comptes du PERSIF. Exercices 2023 et 2024\r(l’audit de clôture inclus)', '', 'Guinée', 'Qualité et Coût', '', datetime.date(2024, 2, 9), None, datetime.date(2024, 2, 5), 2)]"
print(list(tokenize.tokenize(iter((x.encode('utf-8'), b'')).__next__))) # Safe.