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.
Ce que je dois créer est le tableau suivant: p> Tout conseil serait grandement apprécié p> p> Data [0] code>
donne une sortie: p> 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> p>
6 Réponses :
Ceci est une approche à l'aide de regex. ex: strong> p> sortie: strong> p> re.match code>. 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 )
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)
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)
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]]
Si vous n'êtes pas à l'aise avec une expression régulière, vous pouvez utiliser ce bit de code.
p> p>
Le contenu de la liste ressemble à XML et XML doit être traité comme XML. Il n'y a qu'une finale Si l'ordre des attributs change, cela fonctionnera toujours. P> P> '>' code> manquante. Nous pouvons donc utiliser un analyseur XML pour gérer cela.
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
' code> à 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.