当前位置:网站首页>Comment reconnaître la validité d'une adresse avec une machine à l'état fini?

Comment reconnaître la validité d'une adresse avec une machine à l'état fini?

2021-09-15 04:33:04 Somenzz

Au moment de remplir l'adresse du Service de messagerie,Nous entrons souvent l'adresse manuellement pour permettre au Programme d'identifier intelligemment,Des adresses standard comme,xxProvincexxVillexxDistrict/ZonexxRoutexxNo.,Mais parfois, il est facile d'écrire:xxVillexxDistrict/ZonexxRoutexxNo.,OuxxProvincexxDistrict/ZonexxRoutexxNo.,OuxxVillexxRoutexxNo..

Mais certains ne sont pas des adresses légales,Par exemple, xxProvincexxRuexxNo.,Ou xxVillexxProvincexxZonexxNo..

Alors la question se pose,Comment identifier une adresse valide,Exactement.,Comment programmer pour identifier si une adresse chinoise est valide?

Bien que notre cerveau puisse reconnaître,Mais laissez la calculatrice reconnaître,Ce n'est pas facile,La raison fondamentale est que la description de l'adresse, bien qu'elle semble simple,Mais c'est encore une Grammaire contextuelle complexe.

Par exemple, “Beijing East Road, Shanghai xx No.,Beijing East Road, Nanjing xx No.”,Quand j'ai scanné la route est de Pékin,La question de savoir si le numéro de la porte qui suit constitue l'adresse correcte dépend du contexte,Le nom de la ville.

Heureusement,,Le contexte de l'adresse est plus simple,Est limitée,Bien que nous puissions épuiser toutes les provinces par la violence、Ville、Zone、Rue.Mais la méthode efficace est la machine à l'état fini.

Chaque machine à l'état fini a un état de départ et un état de fin,Et plusieurs états intermédiaires,Les conditions dans lesquelles chaque arc passe à l'état suivant avec un état,Par exemple, si l'état actuel dans la figure ci - dessus est provincial,Si vous rencontrez la phrase suivante liée à la zone, entrez la zone,Si la phrase suivante concerne la Ville, entrez dans la ville.

Si une adresse peut démarrer l'état de la machine d'état , Plusieurs états intermédiaires passant par la machine d'état , Et finalement à la fin , Alors cette adresse est valide ,Sinon, il est invalide..

Par exemple, xxVillexxProvincexxZonexxNo. Est une adresse invalide , Impossible de marcher de la ville à la province .

Maintenant, nous le faisons avec une simple machine d'état prioritaire , Le Code a des commentaires , Facile à comprendre

from enum import Enum

def isAddress(address: str) -> bool:

    #Définir l'état
    State = Enum("State", [
        "STATE_INITIAL", #C'est parti.
        "STATE_PROVINCE", # Province
        "STATE_CITY", # Ville
        "STATE_AREA", # Zone / District
        "STATE_STREET", # Rue
        "STATE_NUM", #No.
        "STATE_END", #Fin
        "STATE_ILLEGAL", #État des erreurs
    ])

    def toAddressType(addr_slice : str) -> State:
        if "Province" in addr_slice:
            return State.STATE_PROVINCE
        elif "Ville" in addr_slice:
            return State.STATE_CITY
        elif "Zone" in addr_slice or "District" in addr_slice:
            return State.STATE_AREA
        elif "Route" in addr_slice or "Rue" in addr_slice:
            return State.STATE_STREET
        elif "No." in addr_slice:
            return State.STATE_NUM
        else:
            return State.STATE_ILLEGAL
    
    # Définir le transfert d'état 
    
    transfer = {

        # On peut commencer par   Province ou municipalité 
        State.STATE_INITIAL: {
            State.STATE_PROVINCE, 
            State.STATE_CITY,
        },

        # La province peut tourner   Ville ou district ou Comté 
        State.STATE_PROVINCE:{
            State.STATE_CITY,
            State.STATE_AREA,
        },

        # La ville peut changer de quartier ou de rue 
        State.STATE_CITY: {
            State.STATE_AREA,
            State.STATE_STREET,
        },

        # Le district et le comté peuvent changer de rue 
        State.STATE_AREA: {
            State.STATE_STREET,
        },

        # Les rues peuvent être numérotées ou fermées 
        State.STATE_STREET: {
            State.STATE_NUM,
            State.STATE_END,
        },

        # Le numéro ne peut être transféré qu'à la fin 
        State.STATE_NUM: {
            State.STATE_END,
        },
    }

    st = State.STATE_INITIAL
    for ch in address:
        current_state = toAddressType(ch)
        if current_state not in transfer[st]:
            return False
        st = current_state 

    return st in [State.STATE_STREET, State.STATE_NUM,State.STATE_END]

if __name__ == '__main__':
    address1 = ["Province du Jiangsu","Suzhou City", " Wuzhong District ", " Zhongshan North Road ", "208No."]
    address2 = ["Suzhou City"," Wuzhong District ", " Zhongshan North Road ", "208No."]
    address3 = ["Suzhou City"," District de Wujiang ", " Zhongshan North Road ", "208No."]
    address4 = ["Suzhou City"," District de Wujiang ","208No."]
    address5 = ["Suzhou City"," Zhongshan North Road "]

    assert isAddress(address1)
    assert isAddress(address2)
    assert isAddress(address3)
    assert isAddress(address5)
    assert isAddress(address4) == False

La chaîne d'adresse entière n'est pas segmentée ici , Au lieu de cela, l'adresse est écrite directement sous forme de liste , Principalement pour illustrer la mise en œuvre et l'application de la machine d'état , Le code ci - dessus ne garantit que le format de l'adresse est valide , Ne garantit pas que l'adresse est authentique et valide , Si le jugement est vrai et valide , Il faudrait alors que toutes les provinces du pays 、Ville、 Districts et comtés 、 La rue construit un hash Tableau, Le numéro de la plaque de porte peut être indiqué par la plage , Encore un jugement de transfert d'état .

Code ci - dessus transfer Juste un. hash Tableau, C'est l'équivalent d'une liste exhaustive de tous les transferts corrects , Il est épuisé dans tous les cas , Correspond à n'importe quelle entrée , État nécessitant une évasion .

Les derniers mots

Cet article explique comment réaliser une simple machine à états finis , Le Code est assez générique ,Précédent Ce problème de programmation ,On ne peut pas s'arrêter Est également implémenté avec ce code ,Si ça t'aide, Et s'il vous plaît, un peu d'appréciation 、 Attention au soutien , Le donataire regarde ,Les mains laissent un parfum.

Mise en œuvre open source avec machine à l'état fini :

  1. django-fsm[1]
  2. python-state-machine[2]

Concentre - toi sur moi.,Apprendre un jour Python Petite technologie.

Références

[1]

django-fsm: https://github.com/viewflow/django-fsm

[2]

python-state-machine: https://github.com/jtushman/state_machine

Cet article est partagé par Wechat public Number - PythonNuméro sept.(PythonSeven) ,Auteur:somenzz

La source originale et les informations reproduites sont détaillées dans le texte,En cas d'infraction,Veuillez contacter: [email protected] Supprimer.

Date de publication originale: 2021-09-07

Participation à cet articleTencent Cloud Self - media Sharing Plan,Bienvenue à la lecture,Partager ensemble.

版权声明
本文为[Somenzz]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/09/20210914180056914T.html

随机推荐