成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何用有限狀態機識別地址的有效性?

開發 前端
在收發快遞填寫地址的時候,我們會經常手動輸入地址讓程序智能識別,標準的地址比如,xx省xx市xx縣/區xx路xx號,不過有時候也可以簡單寫:xx市xx縣/區xx路xx號,或者xx省xx縣/區xx路xx號,或者xx市xx路xx號。

[[422204]]

在收發快遞填寫地址的時候,我們會經常手動輸入地址讓程序智能識別,標準的地址比如,xx省xx市xx縣/區xx路xx號,不過有時候也可以簡單寫:xx市xx縣/區xx路xx號,或者xx省xx縣/區xx路xx號,或者xx市xx路xx號。

但是有些就不是合法的地址了,比如 xx省xx街道xx號,或者 xx市xx省xx區xx號。

那么問題來了,如何識別一個地址是否有效,確切的講,如何編程識別一個中國地址是否有效?

雖然我們大腦可以一眼識別,但是讓計算器去識別,可以不是一件容易的事,根本原因在于地址的描述雖然看上去簡單,但是它依然是比較復雜的上下文有關的文法。

比如 “上海市北京東路 xx 號,南京市北京東路 xx 號”,掃描到北京東路時,它后面的門牌號是否構成正確的地址要看上下文,即城市名。

所幸的是,地址的上下文比較簡單,是有限的,雖然我們可以暴力窮舉所有省、市、區、街道。但有效的方法還是有限狀態機。

每一個有限狀態機都有一個開始狀態和一個終止狀態,以及若干中間狀態,每一條弧上帶著一個狀態進入下一個狀態的條件,比如在上圖中當前的狀態如果是省,如果遇到下一個詞組和區有關就進入區,如果遇到下一個詞組和城市有關那么就進入市。

如果一條地址能從狀態機的開始狀態,經過狀態機的若干中間狀態,最終走到終止狀態,則這條地址有效,否則無效。

比如 xx市xx省xx區xx號 就是無效地址,無法從市走到省。

現在我們通過一個簡單的優先狀態機來實現,代碼有注釋,很容易看懂

  1. from enum import Enum 
  2.  
  3. def isAddress(address: str) -> bool: 
  4.  
  5.     #定義狀態 
  6.     State = Enum("State", [ 
  7.         "STATE_INITIAL", #開始 
  8.         "STATE_PROVINCE", # 省 
  9.         "STATE_CITY", # 市 
  10.         "STATE_AREA", # 區 / 縣 
  11.         "STATE_STREET", # 街道 
  12.         "STATE_NUM", #號 
  13.         "STATE_END", #結束 
  14.         "STATE_ILLEGAL", #錯誤狀態 
  15.     ]) 
  16.  
  17.     def toAddressType(addr_slice : str) -> State: 
  18.         if "省" in addr_slice: 
  19.             return State.STATE_PROVINCE 
  20.         elif "市" in addr_slice: 
  21.             return State.STATE_CITY 
  22.         elif "區" in addr_slice or "縣" in addr_slice: 
  23.             return State.STATE_AREA 
  24.         elif "路" in addr_slice or "街道" in addr_slice: 
  25.             return State.STATE_STREET 
  26.         elif "號" in addr_slice: 
  27.             return State.STATE_NUM 
  28.         else
  29.             return State.STATE_ILLEGAL 
  30.      
  31.     #定義狀態轉移 
  32.      
  33.     transfer = { 
  34.  
  35.         #開始可以轉為 省或市 
  36.         State.STATE_INITIAL: { 
  37.             State.STATE_PROVINCE,  
  38.             State.STATE_CITY, 
  39.         }, 
  40.  
  41.         #省可以轉 市或區縣 
  42.         State.STATE_PROVINCE:{ 
  43.             State.STATE_CITY, 
  44.             State.STATE_AREA, 
  45.         }, 
  46.  
  47.         #市可以轉區或街道 
  48.         State.STATE_CITY: { 
  49.             State.STATE_AREA, 
  50.             State.STATE_STREET, 
  51.         }, 
  52.  
  53.         #區縣可以轉街道 
  54.         State.STATE_AREA: { 
  55.             State.STATE_STREET, 
  56.         }, 
  57.  
  58.         #街道可以轉號或終止 
  59.         State.STATE_STREET: { 
  60.             State.STATE_NUM, 
  61.             State.STATE_END, 
  62.         }, 
  63.  
  64.         #號只能轉終止 
  65.         State.STATE_NUM: { 
  66.             State.STATE_END, 
  67.         }, 
  68.     } 
  69.  
  70.     st = State.STATE_INITIAL 
  71.     for ch in address: 
  72.         current_state = toAddressType(ch) 
  73.         if current_state not in transfer[st]: 
  74.             return False 
  75.         st = current_state  
  76.  
  77.     return st in [State.STATE_STREET, State.STATE_NUM,State.STATE_END] 
  78.  
  79. if __name__ == '__main__'
  80.     address1 = ["江蘇省","蘇州市""吳中區""中山北路""208號"
  81.     address2 = ["蘇州市","吳中區""中山北路""208號"
  82.     address3 = ["蘇州市","吳江區""中山北路""208號"
  83.     address4 = ["蘇州市","吳江區","208號"
  84.     address5 = ["蘇州市","中山北路"
  85.  
  86.     assert isAddress(address1) 
  87.     assert isAddress(address2) 
  88.     assert isAddress(address3) 
  89.     assert isAddress(address5) 
  90.     assert isAddress(address4) == False 

這里沒有對整個地址字符串進行分詞,而是直接將地址寫成了列表的形式,主要為了說明狀態機的實現和應用,上述代碼僅能從格式上保證地址是有效的,并不能確保地址真實有效,如果要判斷是真實有效的,那就需要將全國所有的省、市、區縣、街道建立一個 hash 表,門牌號可以用范圍表示,再進行狀態轉移判斷。

上述代碼的 transfer 就是一個 hash 表,相當于把所有正確轉移的情況都窮舉了一遍,它窮盡了在任何一種情況下,對應任何的輸入,需要轉義的狀態。

本文轉載自微信公眾號「Python七號」,可以通過以下二維碼關注。轉載本文請聯系Python七號公眾號。

 

責任編輯:武曉燕 來源: Python七號
相關推薦

2013-09-03 09:57:43

JavaScript有限狀態機

2021-04-29 09:31:05

前端開發技術

2022-03-06 19:57:50

狀態機easyfsm項目

2014-05-21 11:09:56

前端有限狀態機

2025-04-28 08:25:00

狀態機框架狀態機開發

2021-06-05 05:11:52

代碼狀態機邏輯

2023-04-12 07:14:31

Spring應用業務

2023-09-05 07:17:23

2022-09-28 08:18:01

I/ONIO2API

2025-06-04 01:55:00

2021-03-08 10:48:04

AI

2023-12-08 16:32:35

GenAI人工智能AI

2010-07-19 15:07:23

SQL Server評

2023-03-06 07:35:30

狀態機工具訂單狀態

2025-04-14 09:30:11

Spring狀態機訂單

2021-08-19 09:00:00

微服務開發架構

2015-03-24 11:04:58

2016-07-26 11:21:53

2023-07-03 09:49:49

2024-07-09 07:54:26

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91久久精品一区二区三区 | 精品一区av | www国产成人免费观看视频,深夜成人网 | 九九热免费视频在线观看 | 蜜桃精品视频在线 | 紧缚调教一区二区三区视频 | 亚洲九色 | 国产成人精品久久二区二区91 | 99精品久久久国产一区二区三 | 欧美日韩一区二区视频在线观看 | 精品1区 | 天堂在线www | 91天堂网 | 国产精品国产成人国产三级 | 婷婷丁香激情 | 一级片片| 一区在线观看 | 日韩一区二区成人 | 国产特级毛片 | 色眯眯视频在线观看 | 亚洲欧美中文日韩在线v日本 | 高清一区二区三区 | 亚洲性在线 | 欧美一级片黄色 | 欧美日韩在线一区二区三区 | 亚洲视频中文字幕 | 人妖av| 国内精品久久久久久影视8 最新黄色在线观看 | 三级在线视频 | 一久久久| 大学生a级毛片免费视频 | 中文字幕在线观看一区 | 国产激情一区二区三区 | 国产视频一区在线观看 | 亚洲资源在线 | 国产精品一区久久久 | 一区二区影院 | 日本亚洲欧美 | 日韩二三区 | 日本成人中文字幕在线观看 | 97影院在线午夜 |