[PYTHON] À propos du fait que l'objet recompilé peut être utilisé pour le modèle re.match

L'histoire de pousser le coin du module re

re_spam.py


# -*- coding: utf-8 -*-
import re

re.match("spa*m", "spam") #Reconnaître

spam = re.compile("spa*m")
spam.match("spaaaaaaaam") #Reconnaître

re.match(spam, "spaaaam") #Cela fonctionne pour une raison quelconque

L'objet d'expression régulière obtenu par re.compile comme décrit ci-dessus peut être utilisé pour le modèle re.match. Il semble qu'il soit provisoirement déterminé si le modèle passé en tant que modèle est un objet d'expression régulière.

Y a-t-il un mérite à cette méthode? La vitesse de traitement est plus lente que l'utilisation de re.match.

Transition

Ceci est la source de Python-1.5.2 (extrait)

re.py


def _cachecompile(pattern, flags=0):
    key = (pattern, flags)
    try:
        return _cache[key]
    except KeyError:
        pass
    value = compile(pattern, flags)
    if len(_cache) >= _MAXCACHE:
        _cache.clear()
    _cache[key] = value
    return value

def match(pattern, string, flags=0):
    return _cachecompile(pattern, flags).match(string)

def compile(pattern, flags=0):
    "Compile a regular expression pattern, returning a RegexObject."
    groupindex={}
    code=pcre_compile(pattern, flags, groupindex)
    return RegexObject(pattern, flags, code, groupindex)

Il n'y a pas de contrôle particulier. Puis Python-2.0.1 sre.py (extrait)

sre.py


def match(pattern, string, flags=0):
    """Try to apply the pattern at the start of the string, returning
    a match object, or None if no match was found."""
    return _compile(pattern, flags).match(string)

def _compile(*key):
    # internal: compile pattern
    p = _cache.get(key)
    if p is not None:
        return p
    pattern, flags = key
    if type(pattern) not in sre_compile.STRING_TYPES:
        return pattern
    try:
        p = sre_compile.compile(pattern, flags)
    except error, v:
        raise error, v # invalid expression
    if len(_cache) >= _MAXCACHE:
        _cache.clear()
    _cache[key] = p
    return p

Il semble que le modèle soit renvoyé tel quel s'il ne s'agit pas d'une chaîne de caractères compilable. Et Python-2.7.9 re.py (extrait)

re.py


def match(pattern, string, flags=0):
    """Try to apply the pattern at the start of the string, returning
    a match object, or None if no match was found."""
    return _compile(pattern, flags).match(string)

def _compile(*key):
    # internal: compile pattern
    pattern, flags = key
    bypass_cache = flags & DEBUG
    if not bypass_cache:
        cachekey = (type(key[0]),) + key
        try:
            p, loc = _cache[cachekey]
            if loc is None or loc == _locale.setlocale(_locale.LC_CTYPE):
                return p
        except KeyError:
            pass
    if isinstance(pattern, _pattern_type):
        if flags:
            raise ValueError('Cannot process flags argument with a compiled pattern')
        return pattern
    if not sre_compile.isstring(pattern):
        raise TypeError, "first argument must be string or compiled pattern"
    try:
        p = sre_compile.compile(pattern, flags)
    except error, v:
        raise error, v # invalid expression
    if not bypass_cache:
        if len(_cache) >= _MAXCACHE:
            _cache.clear()
        if p.flags & LOCALE:
            if not _locale:
                return p
            loc = _locale.setlocale(_locale.LC_CTYPE)
        else:
            loc = None
        _cache[cachekey] = p, loc
    return p

En plus de vérifier si le modèle est une chaîne, il vérifie également s'il a été compilé et indique clairement que "le premier argument doit être une chaîne ou un modèle compilé".

Recommended Posts

À propos du fait que l'objet recompilé peut être utilisé pour le modèle re.match
Fonctions pouvant être utilisées dans l'instruction for
À propos du fait que le résumé de la torche peut être vraiment utilisé lors de la construction d'un modèle avec Pytorch
[Django] À propos des utilisateurs pouvant être utilisés sur un modèle
Goroutine (contrôle parallèle) utilisable sur le terrain
Goroutine utilisable sur le terrain (édition errgroup.Group)
Comment définir des variables pouvant être utilisées dans toute l'application Django ~ Utile pour les modèles, etc. ~
Un minuteur (ticker) qui peut être utilisé sur le terrain (peut être utilisé n'importe où)
Module standard Python utilisable en ligne de commande
Comprendre les probabilités et les statistiques qui peuvent être utilisées pour la gestion des progrès avec un programme python
J'ai créé un modèle de projet Python générique
Masquer l'avertissement selon lequel zsh peut être utilisé par défaut sur Mac
Optimisation mathématique pour un travail gratuit avec Python + PuLP
Types de fichiers pouvant être utilisés avec Go
À propos de localhost: 4040 n'est pas accessible après l'exécution de Spark avec Docker
À propos de la question qui s'inquiétait de l'erreur d'échantillonnage
Le problème que la commande ifconfig ne peut pas être utilisée
Présentation et fonctionnalités utiles de scikit-learn qui peuvent également être utilisées pour l'apprentissage en profondeur
Serveur de partage de fichiers réalisé avec Raspberry Pi pouvant être utilisé pour le travail à distance
Algorithmes de base utilisables par les pros de la compétition
Notes sur les connaissances Python utilisables avec AtCoder
Enregistrement d'image ANT qui peut être utilisé en 5 minutes
4 boîtes qui pourraient être utiles pour les hackers de Pepper
Lister les classes qui peuvent être référencées par ObjCClass
À propos du modèle de visiteur
[Django] Noms de champs pouvant être utilisés pour le modèle utilisateur, l'enregistrement des utilisateurs et les méthodes de connexion
[Atcoder] [C ++] J'ai fait un outil d'automatisation de test qui peut être utilisé pendant le concours
Notes diverses sur l'utilisation de python pour les projets
Scripts pouvant être utilisés lors de l'utilisation de Bottle en Python
J'ai étudié le prétraitement qui peut être fait avec PyCaret
[Flask] J'ai essayé de résumer la "configuration docker-compose" qui peut être créée rapidement pour les applications Web
J'ai essayé de l'étendre pour que la base de données puisse être utilisée avec le logiciel d'analyse de Wiire
Le littéral octal peut être utilisé dépend du langage de programmation
Gestion des chaînes de caractères dans la communication JSON
Résumé de l'entrée standard de Python pouvant être utilisée dans Competition Pro
Les filtres Kalman peuvent-ils être utilisés pour prédire les tendances boursières?
J'ai écrit un tri-arbre qui peut être utilisé pour l'implémentation de dictionnaire à grande vitesse en langage D et Python
Solution au problème que Ctrl + z ne peut pas être utilisé dans Powershell dans l'environnement Docker pour Windows (provisoire)
Un mémo lors de la création d'un environnement qui peut être débogué avec Lambda @ Edge pour le moment
Incontournable pour les nouveaux ingénieurs! Les caractéristiques techniques de votre entreprise qui peuvent être appréhendées grâce à une formation web!