#19 re&jieba模塊

来源:https://www.cnblogs.com/minutesheep/archive/2019/02/09/10357209.html
-Advertisement-
Play Games

本片博文主要記錄Python中正則表達式re模塊和中文分詞模塊jieba ...


前言

在Python中,需要對字元串進行大量的操作,有時需要從一個字元串中提取到特定的信息,用切片肯定是不行的,所有這一節記錄兩個強大的文本處理模塊,一個是正則表達式re模塊,另一個是中文處理模塊jieba,Here wo go!

一、re模塊

re模塊的出現使得Python完全支持正則表達式,在學re模塊之前,先來認識一下正則表達式

正則表達式使用單個字元串來描述、匹配出特定句法的字元串,在文本編輯中,正則表達式常用來檢索、替換那些特定匹配模式的文本。正則表達式使用起來十分繁瑣,但是它帶來的功能確實無比強大的,掌握正則表達式之後,工作效率將會大幅度提高!

1. 正則表達式基本語法

定位符

正則表達式                                    描述                                      示例
   ^                                      行起始標記                       ^import 匹配以import開頭的行
   $                                       行尾標記                        import$ 匹配以import結尾的行

限定符

正則表達式                                    描述                                      示例
   .                                     匹配任意一個字元                impor.可以匹配到import、imporq、impor1等
   +                                   匹配之前項1次或者多次              import+可以匹配到import、importt、importtt等,但是不能匹配到impor
   *                                   匹配之前項0次或者多次              import*可以匹配到impor、import、importt、importtt等
   ?                                   匹配之前項0次或者1次              impor?t可以匹配到impot、import,但是不能匹配到imporrt
   []                                匹配包含在[字元]的任意字元           impor[tk]可以匹配到import、impork、importk、imporkt 
  [^]                               匹配不包含在[^字元]的任意字元          impor[^tk]匹配不到import、impork、importk、imporkt
[ - ] 匹配[字元-字元]中指定範圍的任意一個字元 1234[5-7]可以匹配到12345、12346、12357
{n} 匹配之前項n次 [0-9]{5}表示匹配任意一個五位數
{n,} 匹配之前項至少n次 [0-9]{5,}表示匹配任意一個五位以上的數(包含五位數)
{n,m} 匹配之前項n到m次 [0-9]{5,7}表示匹配任意一個五位到七位的數(包含五位數和七位數)

標記符

正則表達式                                     描述                                        示例
   ()                          標記一個子表達式的開始和結束位置,供以後使用     ([0-9])表示匹配一個數字,之後可以使用它,比如替換掉它

轉義符 

正則表達式                                    描述
   \n                                   匹配一個換行符
   \f                                   匹配一個換頁符
   \r                                   匹配一個回車符
   \s                                  匹配任何空白字元
   \S                                 匹配任何非空白字元
   \t                                   匹配一個製表符
   \v                                 匹配一個垂直製表符
   \cx                         匹配一個Control-x,x在a-z和A-Z之間
\w 匹配數字字母下劃線
\W 不匹配數字字母下劃線
\d 匹配數字
\D 不匹配數字
\b 匹配一個單詞邊界,也就是指單詞的結尾
\B 匹配非單詞邊界

說明:想要匹配出上述特殊字元,需要對其進行轉義,例如想要匹配*號,則需要這樣寫\*

貪婪匹配和非貪婪匹配

貪婪匹配是全匹配,一直匹配到最後一個為止;非貪婪匹配則是匹配到一個就停止

正則表達式                                  描述
   .*                                    貪婪匹配
   .*?                                  非貪婪匹配

# <a>Hello,world!</a>
#貪婪匹配:<.*>匹配到<a>Hello,world!</a>
#非貪婪匹配:<.*?>匹配到<a>

2. re模塊

re.match(pattern, string, flags=0) 「從字元串開頭匹配一次,匹配成功返回結果,匹配失敗返回None;pattern表示匹配模式、string表示原字元串、flags表示標誌位,用來控制匹配模式」

In [7]: import re                   # 導入re模塊

In [8]: test = 'qwer1234asdf5678'   #初始化一個字元串,用來示例

In [9]: re.match('\w', test)        # 從開頭匹配一個字母或數字或下劃線
Out[9]: <_sre.SRE_Match object; span=(0, 1), match='q'>

In [10]: re.match('\w+', test)      # 從開頭匹配數字或字母或下劃線多個
Out[10]: <_sre.SRE_Match object; span=(0, 16), match='qwer1234asdf5678'>

In [11]: re.match('\w.', test)      # 從開頭匹配一個字母或數字或下劃線 和 一個任意字元
Out[11]: <_sre.SRE_Match object; span=(0, 2), match='qw'>

In [12]: re.match('\w*', test)      # 從開頭匹配一個字母或數字或下劃線 和 其他所有字元
Out[12]: <_sre.SRE_Match object; span=(0, 16), match='qwer1234asdf5678'>

In [14]: re.match('\w{5}', test)    # 從開頭匹配5個字母或數字或下劃線
Out[14]: <_sre.SRE_Match object; span=(0, 5), match='qwer1'>
In [15]: re.match('\d',test)        # 從開頭匹配一個數字

# 匹配失敗,返回None(也就是啥也不返回)

re.search(pattern, string, flags=0) 「從整個字元串中匹配一次,匹配成功返回結果,匹配失敗返回None;pattern表示匹配模式、string表示原字元串、flags表示標誌位,用來控制匹配模式」

In [17]: test
Out[17]: 'qwer1234asdf5678'

In [18]: re.search('\w',test)       # 匹配一個字母或數字或下劃線
Out[18]: <_sre.SRE_Match object; span=(0, 1), match='q'>

In [19]: re.search('\d',test)       # 匹配一個數字,即使數字不在開頭也可以匹配到
Out[19]: <_sre.SRE_Match object; span=(4, 5), match='1'>

re.findall(pattern, string, flags=0) 「從整個字元串中匹配多次,匹配成功返回所有結果的列表,匹配失敗則返回空列表;pattern表示匹配模式、string表示原字元串、flags表示標誌位,用來控制匹配模式」

In [25]: test
Out[25]: 'qwer1234asdf5678'

In [26]: re.findall('\d',test)     # 將所有數字匹配出來,返回列表
Out[26]: ['1', '2', '3', '4', '5', '6', '7', '8']

re.finditer(pattern, string, flags=0) 「與findall類似,只是返回迭代器

In [27]: test
Out[27]: 'qwer1234asdf5678'

In [28]: re.finditer('\d',test)    # 可以看到返回的是迭代器
Out[28]: <callable_iterator at 0x1037e4c88>

In [29]: for _ in re.finditer('\d',test):
    ...:     print(_)
<_sre.SRE_Match object; span=(4, 5), match='1'>
<_sre.SRE_Match object; span=(5, 6), match='2'>
<_sre.SRE_Match object; span=(6, 7), match='3'>
<_sre.SRE_Match object; span=(7, 8), match='4'>
<_sre.SRE_Match object; span=(12, 13), match='5'>
<_sre.SRE_Match object; span=(13, 14), match='6'>
<_sre.SRE_Match object; span=(14, 15), match='7'>
<_sre.SRE_Match object; span=(15, 16), match='8'>

標誌位flags

標誌位                                             描述
 re.I                                          無視大小寫
 re.L                                        本地化識別匹配
 re.S                             使.匹配所有字元,預設情況下.不匹配換行符
 re.M                                     多行匹配,將影響^和$
 re.U                           根據Unicode字元集解析,將影響\w,\W,\b,\B
 re.X                        通過給予更靈活的格式以便將正則表達式寫得更易於理解
In [30]: test = 'ABCD123qwer567'

In [31]: re.findall('[a-z]', test)         # 匹配小寫字母
Out[31]: ['q', 'w', 'e', 'r']

In [33]: re.findall('[a-z]', test, re.I)   # 匹配字母,不區分大小寫
Out[33]: ['A', 'B', 'C', 'D', 'q', 'w', 'e', 'r']
In [34]: re.findall(pattern, string, re.I|re.M|re.S)

# 多個標誌位的寫法

re.compile(pattern, flags=0) 「生成一個pattern對象,用於re.match、re.search、re.findall」

In [36]: test
Out[36]: 'ABCD123qwer567'

In [37]: pattern = re.compile('\d')      # 生成一個pattern對象

In [38]: re.findall(pattern, test)   
Out[38]: ['1', '2', '3', '5', '6', '7']

In [39]: re.match(pattern, test)

In [40]: re.search(pattern, test)
Out[40]: <_sre.SRE_Match object; span=(4, 5), match='1'>

re.sub(pattern, repl, string, count=0, flags=0) 「替換匹配的字元串,pattern表示匹配模式、repl表示替換成的字元串,string表示原字元串(被替換字元串)、flags表示標誌位,用來控制匹配模式」

In [51]: test = 'ADFSA12fsf3456sfs234'

In [52]: pattern = '\D'              # 匹配非數字

In [53]: re.sub(pattern, '',test)    # 將非數字替換為空
Out[53]: '123456234'                 # 結果只留下數字

貪婪匹配與非貪婪匹配

In [56]: test = '<h1>I am <MinuteSheep></h1>'

In [57]: greedy_pattern = re.compile('>(.*)<')       # 貪婪匹配模式

In [58]: no_greedy_pattern = re.compile('>(.*?)<')   # 非貪婪匹配模式

In [59]: re.findall(greedy_pattern, test)            # 貪婪匹配結果,尋找最後一個<
Out[59]: ['I am <MinuteSheep>']

In [60]: re.findall(no_greedy_pattern, test)         # 非貪婪匹配結果,尋找第一個<
Out[60]: ['I am ', '']

通常情況下先使用re.compile(非貪婪匹配)生成一個匹配模式,再使用re.findall()返回結果列表進行下一步操作

二、jieba模塊

上面的re模塊是否讓你熱血沸騰,正則表達式熟練使用後會給你的工作效率帶來飛一般的提高,但如果讓其來對一段中文進行分析詞語來說,還是欠缺了許多,對於中文分詞來說,第三方模塊jieba會給你帶來意想不到的結果

1. jieba安裝

使用pip安裝

pip install jieba

2. jieba分詞模式

jieba擁有三種分詞模式:精確模式、全模式、搜索引擎模式

2.1 精確模式(預設模式)jieba.cut(sentence, cut_all=False, HMM=True) 或者 jieba.lcut(sentence, cut_all=False, HMM=True) 「cut返回生成器,lcut返回列表;sentence表示要分割的句子、cut_all表示是否為全模式、HMM表示是否使用HMM」

In [1]: import jieba              # 導入jieba模塊

In [3]: test = '正則表達式熟練使用後會給你的工作效率帶來飛一般的提高'

In [4]: jieba.cut(test)           # 精確模式,返回生成器
Out[4]: <generator object Tokenizer.cut at 0x1059c6990>

In [6]: ':'.join(jieba.cut(test))  
Out[6]: '正則表達式:熟練:使用:後會:給:你:的:工作效率:帶來:飛:一般:的:提高'

In [7]: jieba.lcut(test)          # 返回列表
Out[7]: ['正則表達式', '熟練', '使用', '後會', '', '', '', '工作效率', '帶來', '', '一般', '', '提高']

2.2 全模式 jieba.cut(sentence, cut_all=True, HMM=True) 或者 jieba.lcut(sentence, cut_all=True, HMM=True)

In [8]: test
Out[8]: '正則表達式熟練使用後會給你的工作效率帶來飛一般的提高'

In [9]: jieba.cut(test, cut_all=True)   # 使用全模式
Out[9]: <generator object Tokenizer.cut at 0x1059c02b0>

In [10]: ':'.join(jieba.cut(test, cut_all=True))
Out[10]: '正則:正則表達式:表達:表達式:達式:熟練:使用:後會:給:你:的:工作:工作效率:效率:帶來:飛:一般:般的:提高'

2.3 搜索引擎模式 jieba.cut_for_search(sentence, HMM=True) 或者 jieba.cut_for_search(sentence, HMM=True)   「搜索引擎模式粒度較細」

In [12]: test
Out[12]: '正則表達式熟練使用後會給你的工作效率帶來飛一般的提高'

In [13]: jieba.cut_for_search(test)    # 使用搜索引擎模式
Out[13]: <generator object Tokenizer.cut_for_search at 0x10b2acaf0>

In [14]: ':'.join(jieba.cut_for_search(test))
Out[14]: '正則:表達:達式:表達式:正則表達式:熟練:使用:後會:給:你:的:工作:效率:工作效率:帶來:飛:一般:的:提高'

通過上述三種模式可以明顯看到分詞的不同,根據世紀使用需求來確定使用那種模式吧

3. jieba添加詞典

jieba模塊中預設使用的詞典為jieba.dt,預設的詞典有時沒有我們要用的詞語,只有自己添加或調整詞典才能解決

3.1 使用jieba函數增加新詞 jieba.add_word(word, freq=None, tag=None) 「word表示新詞、freq表示詞頻、tag表示詞性」

In [24]: test
Out[24]: '正則表達式熟練使用後會給你的工作效率帶來飛一般的提高'

In [25]: ':'.join(jieba.cut(test, HMM=False))
Out[25]: '正則表達式:熟練:使用:後:會:給:你:的:工作效率:帶來:飛:一般:的:提高'

In [26]: jieba.add_word('後會')   # 增加新詞:後會

In [27]: ':'.join(jieba.cut(test, HMM=False))
Out[27]: '正則表達式:熟練:使用:後會:給:你:的:工作效率:帶來:飛:一般:的:提高'

# 註意:自己添加新詞或者改變詞頻後,使用HMM可能使新詞無用

3.2 刪除詞語 jieba.del_word(word) 「刪除詞語」

In [29]: jieba.del_word('後會')   # 刪除詞語:後會

3.3 改變詞頻 jieba.suggest_freq(segment, tune=False) 「segment表示要修改的詞,用元組表示,tune表示是否能被分出來」

In [31]: test
Out[31]: '正則表達式熟練使用後會給你的工作效率帶來飛一般的提高'

In [32]: ':'.join(jieba.cut(test))
Out[32]: '正則表達式:熟練:使用:後:會:給:你:的:工作效率:帶來:飛:一般:的:提高'

In [35]: jieba.suggest_freq(('正則','表達式'),True)  # 允許(正則、表達式)被分割出來,返回0則證明成功
Out[35]: 0

In [36]: ':'.join(jieba.cut(test))
Out[36]: '正則:表達式:熟練:使用:後:會:給:你:的:工作效率:帶來:飛:一般:的:提高'

3.4 使用文件添加詞典 jieba.load_userct(file_name) 「file_name表示要載入的字典文件名」

有時需要添加大量的新辭彙,總不能一條一條的敲代碼,jieba有一個載入新字典的方法:jieba.load_userct(file_name) 

對要載入的字典是有格式要求的,一個詞占一行,一行有三個部分(詞語、詞頻、詞性),用空格隔開,順序不可顛倒,其中,詞頻和詞性可以省略

4. 詞頻分析

4.1 詞頻分析 jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False) 「sentence表示要分析的句子、topK表示返回多少個高頻詞語(預設為20個)、withWeight表示返回詞語時是否帶權重、allowPOS表示僅分析指定詞性的詞」

import jieba.analyse   # 需要單獨導入jieba.analyse
test = '''
《紅樓夢》,中國古典長篇章回小說,是中國四大小說名著之一。《紅樓夢》書內提及的別
名,還有《情僧錄》、《風月寶鑒》[1]、《金陵十二釵》、《金玉緣》;故事是從女媧補>天時所剩下的一塊石頭講起,因此又名《石頭記》。乾隆四十九年甲辰(1784年)夢覺主人
序本題為《紅樓夢》(甲辰夢序抄本)。1791年在第一次活字印刷(程甲本)後,《紅樓夢》便取代《石頭記》成為通行的書名。

原本前80回尚存。全本回數問題有兩說:據脂硯齋批語,應少於114回;而據高鶚、程偉元>的版本,為百二十回。後來高鶚、程偉元取得後40回稿,並整理印行,即為目前較通行的120回全本。

程偉元稱,自己經過多年收集,重金購得《紅樓夢》後四十回殘稿,並對不連貫的地方進行補綴。於1791年和1792年印行一百二十回《紅樓夢》。一百多年間,《紅樓夢》以此流傳,受到讀者歡迎。

從1969年代開始,胡適“大膽假設、小心求證”,認為後四十回非曹雪芹著,並提出高鶚續書後四十回,且後四十回不如前八十回,程乙本並非紅樓夢最佳讀本。胡適在甲戌本跋中舉例,天香樓事合家皆知,“無不納罕,都有些疑心”,程乙本竟作“無不納悶,都有些傷心”,只
有些傷心而已嗎?完全扭曲上下文意。

人民文學出版社認為後四十回是無名氏續,高鶚、程偉元整理。另外周汝昌則認為《紅樓夢》原著共108回,現存78回,後30回迷失。

《紅樓夢》被評為中國古典章回小說的巔峰之作,思想價值和藝術價值極高。在20世紀,《紅樓夢》是中國最受重視的一部文學作品之一。因為其不完整,加上作者曹氏已亡故,所述內容又鉅細靡遺,結局設定更是超乎尋常,留下許多謎團引人探究,也構成了一門學問——紅
學。自胡適作《紅樓夢考證》以來,一般認為曹雪芹以其家族的命運投射在《紅樓夢》一書。
'''

print(jieba.analyse.extract_tags(test, withWeight=True))

# 運行結果:

Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/n_/mj10v8d10h32_dzzwb8y3hs80000gn/T/jieba.cache
Loading model cost 0.800 seconds.
Prefix dict has been built succesfully.
[('紅樓夢', 0.5276318504898648), ('四十回', 0.297466902509009), ('高鶚', 0.2214637790900901), ('程偉元', 0.21540121626846845), ('胡適', 0.13942106369594595), ('甲辰', 0.1090893529972973), ('程乙本', 0.10770060813423422), ('1791', 0.10770060813423422), ('章回小說', 0.09970688565675676), ('全本', 0.0987048529081081), ('石頭記', 0.09738410088828829), ('曹雪芹', 0.09400848422702703), ('印行', 0.0883453431509009), ('認為', 0.06910881164756758), ('傷心', 0.0672914105409009), ('通行', 0.06724799354603603), ('無不', 0.06671542428864866), ('古典', 0.06622546765531531), ('有些', 0.06305848415594595), ('周汝昌', 0.0626156650990991)]
python test.py 1.81s user 0.17s system 99% cpu 1.993 total

5.並行分詞

5.1 打開並行分詞 jieba.enable_parallel(num) 「num代表並行進程數」

5.2 關閉並行分詞 jieba.disable_parallel()

In [1]: import jieba

In [2]: jieba.enable_parallel(4)    # 開啟4個進程
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/n_/mj10v8d10h32_dzzwb8y3hs80000gn/T/jieba.cache
Loading model cost 0.793 seconds.
Prefix dict has been built succesfully.

In [4]: jieba.cut('我愛北京天安門')
Out[4]: <generator object _pcut at 0x108dfc1a8>

In [5]: jieba.disable_parallel()    # 關閉並行分詞

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • list刪除 為什麼迴圈刪除沒有刪乾凈呢,原因就是列表在迴圈遍歷的時候裡面相當於有個變數指針,迴圈第一次,這個index = 0,刪除成功,然後列表中的索引為1的值就往前挪,就變成 了索引值為0的,然後index=1,跳過現在索引為0繼續刪除索引為1的數值。 正確刪除的做法: 意思就是創建一個新列表 ...
  • 題意 "題目鏈接" Sol 知道FFT能做字元串匹配的話這就是個裸題了吧。。 考慮把B翻轉過來,如果$\sum_{k = 0}^M (B_{i k} A_k)^2 B_{i k} A_k = 0$ 那麼說明能匹配。然後拆開三波FFT就行了 ...
  • 線段樹 線段樹的每一個節點都代表一段 區間 線段樹用於維護符合結合律的的信息 (比如區間max/min、sum、xor之類的) 線段樹 在最壞的情況下效率低於分塊(大常數) 線段樹 是一顆二叉樹,對於每個父親節點(編號i)存在兩個兒子,編號分別為2i和2i+1. 建樹 1 void build(ll ...
  • seek() 1.當一個文件打開時,指針預設在開頭 2.seek(0,0)把指針拉回開頭 3.seek()在python3中不支持往左位移(指針不能向左邊調)(第一個參數不能為負數) 4.seek(位移量,參照物) 總結:seek()相當於無形的滑鼠操作 tell() tell就是獲取當前指針到開頭 ...
  • 題意 "題目鏈接" Sol 異或高斯消元的板子題。 bitset優化一下,複雜度$O(\frac{nm}{32})$ 找最優解可以考慮高斯消元的過程,因為異或的特殊性質,每次向下找的時候找到第一個1然後交換就行,這樣顯然是最優的 cpp include using namespace std; co ...
  • 第84節:Java中的網路編程(中) 實現客戶端和服務端的通信: 客戶端需要的操作,創建socket,明確地址和埠,進行鍵盤錄入,獲取需要的數據,然後將錄入的數據發送給服務端,為socket輸出流,然後進行讀取服務端發送回來的大寫數據,為socket讀取流,最後進行客戶端顯示器的顯示,進行讀寫操作 ...
  • 上手Tomcat 1.Ubuntu 18.04 下載/安裝Tomcat 以下內容 "參考鏈接" 1. 安裝JDK 2. 創建Tomcat用戶 從安全形度考慮,Tomcat應當由非Root用戶運行。所以接下來我們要創建一個用戶組和用戶來運行Tomcat 添加用戶組: 添加用戶: 3. 安裝Tomcat ...
  • 題意 "題目鏈接" Sol 不會卡常,自愧不如。下麵的代碼只有66分。我實在懶得手寫平衡樹了。。 思路比較直觀:拿個set維護每個數出現的位置,再寫個線段樹維護區間和 cpp include define LL long long const int MAXN = 5e5 + 10, INF = 1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...