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'}
5 Réponses :
>>> [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.
Il existe un moyen qui ne nécessite pas Finditer code> ni dictionnaire fusionner. Voir Ma réponse .
Utilisez une barre verticale ("ou") dans le modèle RE, et Par exemple: P> 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.
>>> 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'}
Il existe un moyen qui ne nécessite pas Finditer code> ni dictionnaire fusionner. Voir Ma réponse .
Le plus proche que je puisse obtenir est-ce: 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']})
Il existe un moyen qui ne nécessite pas Finditer code> ni dictionnaire fusionner. Voir Ma réponse .
Voici un moyen qui ne nécessite pas Ceci suppose que chacun des caractères Finditer code> ni dictionnaire fusion:
B code > et
i code> apparaît exactement une fois dans votre chaîne, sinon: p>
{, 2} code> au lieu de
{2} code>. li>
B code> deux fois et ne pas trouver
i code> du tout). li>
ul> p>
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'}