7
votes

Possible de récupérer un ensemble arbitraire non commandé de groupes nommés dans un seul swoop avec le module de Python?

Ceci est super pratique pour certains problèmes:

>>> re.search('(?P<b>.b.)|(?P<i>.i.)', unknown_order_alphabet_str).groupdict()
{'i': 'hij', 'b': 'abc'}


0 commentaires

5 Réponses :


0
votes
>>> [m.groupdict() for m in re.finditer('(?P<b>.b.)|(?P<i>.i.)', 'abcdefghijk')]
[{'i': None, 'b': 'abc'}, {'i': 'hij', 'b': None}]
Seems to work fine, though if you have many groups checking which one isn't None might get tedious.This finds all .b. and all .i. matches in the string. If you wanted to be sure it one found one of each you will have to check that manually, too.

1 commentaires

Il existe un moyen qui ne nécessite pas Finditer ni dictionnaire fusionner. Voir Ma réponse .



1
votes

Utilisez une barre verticale ("ou") dans le modèle RE, et Finditer code> Pour obtenir tous les objets d'intérêt d'intérêt: chacun aura un groupdict code> avec avec Aucun code> comme valeur pour les groupes non impliqués dans cette correspondance, et que vous pouvez "fusionner" les dicts comme vous préférez.

Par exemple: P>

>>> mergedgroupdict('(?P<b>.b.)|(?P<i>.i.)', 'abcdefghijk')
{'i': 'hij', 'b': 'abc'}
>>> mergedgroupdict('(?P<b>.b.)|(?P<i>.i.)', 'abcdefghijk'[::-1])
{'i': 'jih', 'b': 'cba'}


1 commentaires

Il existe un moyen qui ne nécessite pas Finditer ni dictionnaire fusionner. Voir Ma réponse .



0
votes

Le plus proche que je puisse obtenir est-ce: xxx pré>

Comment vous combinez les dictionnaires, alors dépendez-vous de savoir si vous attendez plus d'un match. Si vous voulez seulement un match chacun, vous pouvez faire: P>

>>> results = defaultdict(lambda: [])
>>> for match in re.finditer('(?P<b>.b.)|(?P<i>.i.)', 'abcdefghijkabcdefghijk'):
...     for k, v in match.groupdict().iteritems():
...         if v is not None:
...             results[k].append(v)
... 
>>> results
defaultdict(<function <lambda> at 0x7f53d0992c08>, {'i': ['hij', 'hij'], 'b': ['abc', 'abc']})


1 commentaires

Il existe un moyen qui ne nécessite pas Finditer ni dictionnaire fusionner. Voir Ma réponse .



0
votes

Voici un moyen qui ne nécessite pas Finditer ni dictionnaire fusion: xxx

Ceci suppose que chacun des caractères B et i apparaît exactement une fois dans votre chaîne, sinon:

  • Si l'un des caractères peut être manquant, vous pouvez utiliser {, 2} au lieu de {2} .
  • Si l'un des caractères apparaît plus d'une fois, la recherche récupérera les deux premières apparitions de d'entre elles (par exemple, il peut trouver B deux fois et ne pas trouver i du tout).

0 commentaires

0
votes

Voici un concours tardif du jeu en un seul Swipe, lisible pour les débutants aussi:

>>> dict([(name, re.search(pattern, "abcdefghijk").group())
          for name, pattern in {"b": ".b.", "i": ".i"}.items()])  
{'b': 'abc', 'i': 'hij'}


0 commentaires