-1
votes

Fractionnement des éléments de la liste dans un tableau

J'ai un ensemble de données de chaînes et j'ai besoin de filtrer les parties clés de la chaîne dans un tableau.

Data [0] donne une sortie: xxx

Ce que je dois créer est le tableau suivant:

key_data [0] -> [ellipse ', 32.0, 8.0, 'Silver', 16.0, 16.0], [ellipse ', 32,0, 56,0, "Green", 32,0, 16.0], ["Ellipse', 8.0, 8.0," Green ", 16.0, 32.0]] < / code>

Tout conseil serait grandement apprécié


4 commentaires

On dirait qu'une expression régulière simple devrait pouvoir extraire tous les bits que vous voulez.


Ne devrait-il pas y avoir BA A ' à la fin de la troisième ellipse dans l'entrée?


@Barmar, oui va éditer ceci


"Ellipse 'est-il toujours là? ou peut-il être des données différentes? Si tel est le cas, veuillez fournir un modèle généralisé ... comme @barmar a dit: Un simple Regex < / a> fera probablement le travail. Découvrez REGEX101 pour construire et tester de manière interactive la vôtre. C'est mon éditeur de retour pour le bâtiment Regex.


6 Réponses :


0
votes

Ceci est une approche à l'aide de regex. re.match code>.

ex: strong> p> xxx pré>

sortie: strong> p>

data = ['<ellipse cx="32.0" cy="8.0" fill="silver" rx="16.0" ry="16.0" /', '<ellipse cx="32.0" cy="56.0" fill="green" rx="32.0" ry="16.0" /', '<ellipse cx="8.0" cy="8.0" fill="green" rx="16.0" ry="32.0" /']
result = []
for i in data:
    m = re.match(r"\<([a-z]+)", i)
    attribs = re.findall(r'\w+="(.*?)"', i)
    result.append([m.group(1)] + attribs )


0 commentaires

1
votes
import re

data = ['<ellipse cx="32.0" cy="8.0" fill="silver" rx="16.0" ry="16.0" /',
        '<ellipse cx="32.0" cy="56.0" fill="green" rx="32.0" ry="16.0" /',
        '<ellipse cx="8.0" cy="8.0" fill="green" rx="16.0" ry="32.0" /']

re_compile = re.compile(r'<(.*?) cx="(.*?)" cy="(.*?)" fill="(.*?)" rx="(.*?)" ry="(.*?)" /')
result = list(map(lambda x: re_compile.search(x).groups(), data))
print(result)

0 commentaires

0
votes

regex code> est une meilleure approche, mais si vous ne voulez pas l'utiliser, vous pouvez faire de cette manière:

new_l = []
for i in data:
    sub_l = []
    el = i.split()
    sub_l.append(el[0][1:])
    for e in el[1:]:
        x = e.split('=')
        try:
            sub_l.append(x[1].strip().strip('"'))
        except IndexError:
            continue
    new_l.append(sub_l)


0 commentaires

0
votes

Voici une solution qui ne utilise pas d'expressions régulières.

a = ['<ellipse cx="32.0" cy="8.0" fill="silver" rx="16.0" ry="16.0" ',
 '<ellipse cx="32.0" cy="56.0" fill="green" rx="32.0" ry="16.0" ',
 '<ellipse cx="8.0" cy="8.0" fill="green" rx="16.0" ry="32.0" ']

d = [i.split() for i in a]
r = [[j.split('=')[-1] for j in i] for i in d]
s = [[i.strip('"').lstrip('<') for i in k] for k in r]

# convert to float where possible
for k in s:
    for i, j in enumerate(k):
        try:
            k[i] = float(j)
        except ValueError:
            pass

>>> print(s)
[['ellipse', 32.0, 8.0, 'silver', 16.0, 16.0],
['ellipse', 32.0, 56.0, 'green', 32.0, 16.0],
['ellipse', 8.0, 8.0, 'green', 16.0, 32.0]]


0 commentaires

0
votes

Si vous n'êtes pas à l'aise avec une expression régulière, vous pouvez utiliser ce bit de code. xxx


0 commentaires

0
votes

Le contenu de la liste ressemble à XML et XML doit être traité comme XML. Il n'y a qu'une finale '>' manquante. Nous pouvons donc utiliser un analyseur XML pour gérer cela. XXX

Si l'ordre des attributs change, cela fonctionnera toujours.


0 commentaires