7
votes

En utilisant une regex comme modèle avec python

J'ai l'idée d'utiliser un modèle de regex comme modèle et me demander s'il y a un moyen pratique de le faire en python (3 ou plus récent).

/something/1


6 commentaires

Ce n'est pas vraiment ce qu'une regex est pour. L'exemple de Silentghost est ce que vous recherchez.


Oui, je sais que ce n'est pas ce que les regex ont été faits pour, mais je pourrais utiliser une regex pour correspondre et comme modèle dans mon cas.


Il est utile que la construction d'URL telles que Django se trouve dans {% URL%}} tag.


Ce serait très utile. Ce serait génial si vous pouviez générer des URL (c'est-à-dire une mise en forme de chaîne) avec le même code que vous utilisez pour rouler les URL (c'est-à-dire des expressions régulières).


Je viens de mettre quelque chose comme ça ensemble ... voyez ci-dessous.


Une note de plus: Si vous utilisez ceci pour les URL et que vous utilisez cette utilisation sur le cadre de Django, consultez la fonction inverse , qui génère des URL basées sur votre routeur URL: docs.djangoproject.com/fr/dev/ref/urlresolvers


4 Réponses :


4
votes

Ce n'est pas ce que les regex sont destinés, vous pouvez simplement utiliser la mise en forme normale des chaînes.

>>> '/something/{id}'.format(id=1)
'/something/1'


0 commentaires

1
votes

Enregistrez la compilée jusqu'à la substitution:

pattern = re.compile("/something/(?P<%s>.*)" % 1)


0 commentaires

3
votes

ci-dessous est une classe de poids léger que j'ai créée qui fait ce que vous recherchez. Vous pouvez écrire une seule expression régulière et utiliser cette expression pour à la fois chaînes assorties et génération de chaînes.

Il existe un petit exemple sur le bas du code sur la façon de l'utiliser.

En règle générale, vous construisez une expression régulière normalement et utilisez la correspondance correspondant et recherche fonctionne normalement. La fonction Format est utilisée beaucoup comme string.format pour générer une nouvelle chaîne. xxx

Il y a quelques limitations:

  • La fonction de format fonctionne uniquement avec les arguments de mots clés (vous ne pouvez pas utiliser le formatage \ 1 comme dans string.format ).
  • Il y a aussi un bogue avec des éléments assortis avec des sous-éléments, par exemple, réégégalités (R '(? p biz (Baz)?)') . Cela pourrait être corrigé avec un peu de travail.
  • Si votre expression régulière contient des classes de caractères à l'extérieur d'un groupe nommé, (par exemple, [A-Z123] ) Nous ne saurons pas formater ceux-ci.

0 commentaires

1
votes

Pour des cas très simples, le moyen le plus simple de le faire est de remplacer les groupes de capture nommés avec des champs de format.

Voici un validateur / formateur de base: P>

>>> phonenum.search('(333) 444-5678')
{'area': '333', 'prefix': '444', 'line': '5678'}

>>> phonenum.format(area=111, prefix=555, line=444)
(111) 555-444


0 commentaires