web-dev-qa-db-fra.com

Comment puis-je extraire des n-uplets d'une chaîne?

J'ai la chaîne suivante:

r"(A1,B1,C1,D1),(A2,B2,C2,D2),..."

et je veux extraire une liste de tuples

[(A1,B1,C1,D1),(A2,B2,C2,D2),...]

A, B et D sont des entiers, alors que C est une chaîne entourée de guillemets simples. La difficulté réside dans le fait que C peut contenir le caractère any , les guillemets séparés (\'), les virgules (,), les barres obliques inverses (\\) et les entiers. J'essaie de résoudre ce problème en utilisant des expressions rationnelles, mais je ne vois pas comment le faire.

Jusqu'ici, j'ai essayé de faire correspondre la fin de la chaîne en regardant la première citation qui est précédée d'un nombre pair de barres obliques inverses (0, 2, 4, ...), mais je ne peux pas le faire fonctionner. . Une idée?

Résultats attendus:

  • r"(21,3,'abc\',57',1993)" -> (21,3,'abc\',57',1993)
  • r"(21,3,'abc\\',1993)" -> (21,3,'abc\\',1993)
  • r"(21,3,'abc\\\\\',57\\\\',1993)" -> (21,3,'abc\\\\\',57\\\\',1993)
4
Riccardo Bucco

Vous pouvez utiliser ast.literal_eval pour évaluer une chaîne contenant des littéraux en python.

import ast
ip = r"(21,3,'abc\',57',1993)"
op = ast.literal_eval(ip)

print(op)
# output,
# (21, 3, "abc',57", 1993)


# verify that they are correct types,
for i in op:
    print("{} is {}".format(i, type(i)))

# output,
# 21 is <class 'int'>
# 3 is <class 'int'>
# abc',57 is <class 'str'>
# 1993 is <class 'int'>
3
Sufiyan Ghori

Vous pouvez utiliser le motif

(?<=')(?:\\\\|\\'|[^'])+(?=',)|\d+

Pour le contenu de la chaîne (regarde devant et derrière pour 's), il répète un groupe composé de:

  • \\\\ - deux barres obliques inverses (c'est-à-dire, représente une seule barre oblique inverse littérale)
  • \\' - un ' échappé (c’est-à-dire qu’il représente un seul ' littéral)
  • [^'] - N'importe quoi sauf un caractère de citation

Ou alors, cela va correspondre à \d+, aux nombres entiers.

https://regex101.com/r/5beqXJ/1

0
CertainPerformance