最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用re模塊實現(xiàn)okenizer(表達式分詞器)

 更新時間:2022年04月30日 14:10:04   作者:orion-orion  
這篇文章主要介紹了Python使用re模塊實現(xiàn)okenizer,我們這里講解用正則表達式構(gòu)建簡單的表達式分詞器(tokenizer),它能夠?qū)⒈磉_式字符串從左到右解析為標記(tokens)流,需要的朋友可以參考下

一個簡單的tokenizer

分詞(tokenization)任務(wù)是Python字符串處理中最為常見任務(wù)了。我們這里講解用正則表達式構(gòu)建簡單的表達式分詞器(tokenizer),它能夠?qū)⒈磉_式字符串從左到右解析為標記(tokens)流。

給定如下的表達式字符串:

text = 'foo = 12 + 5 * 6'

我們想要將其轉(zhuǎn)換為下列以序列對呈現(xiàn)的分詞結(jié)果:

tokens = [('NAME', 'foo'), ('EQ', '='), ('NUM', '12'), ('PLUS', '+'),\
    ('NUM', '5'), ('TIMES', '*'), ('NUM', '6')]

要完成這樣的分詞操作,我們首先需要定義出所有可能的標記模式(所謂模式(pattern),為用來描述或者匹配/系列匹配某個句法規(guī)則的字符串,這里我們用正則表達式來做為模式),注意此處要包括空格whitespace,否則字符串中出現(xiàn)任何模式中沒有的字符后,掃描就會停止。因為我們還需要給標記以NAME、EQ等名稱,我們采用正則表達式中的命名捕獲組來實現(xiàn)。

import re
NAME = r'(?P<NAME>[a-zA-Z_][a-zA-Z_0-9]*)' 
# 這里?P<NAME>表示模式名稱,()表示一個正則表達式捕獲組,合在一起即一個命名捕獲組
EQ = r'(?P<EQ>=)'
NUM = r'(?P<NUM>\d+)' #\d表示匹配數(shù)字,+表示任意數(shù)量
PLUS = r'(?P<PLUS>\+)' #需要用\轉(zhuǎn)義
TIMES = r'(?P<TIMES>\*)' #需要用\轉(zhuǎn)義
WS = r'(?P<WS>\s+)' #\s表示匹配空格, +表示任意數(shù)量
master_pat = re.compile("|".join([NAME, EQ, NUM, PLUS, TIMES, WS]))  # | 用于選擇多個模式,表示"或"

接下來我們用模式對象中的scanner()方法來完成分詞操作,該方法創(chuàng)建一個掃描對象:

scanner = master_pat.scanner(text)

然后可以用match()方法獲取單次匹配結(jié)果,一次匹配一個模式:

scanner = master_pat.scanner(text)
m = scanner.match() 
print(m.lastgroup, m.group()) # NAME foo
m = scanner.match()
print(m.lastgroup, m.group()) # WS

當然這樣一次一次調(diào)用過于麻煩,我們可以使用迭代器來批量調(diào)用,并將單次迭代結(jié)果以具名元組形式存儲

Token = namedtuple('Token', ['type', 'value'])
def generate_tokens(pat, text):
    scanner = pat.scanner(text)
    for m in iter(scanner.match, None):
        #scanner.match做為迭代器每次調(diào)用的方法,
        #None為哨兵的默認值,表示迭代到None停止
        yield Token(m.lastgroup, m.group())
for tok in generate_tokens(master_pat, "foo = 42"):
    print(tok)

最終顯示表達式串"foo = 12 + 5 * 6"的tokens流為:

Token(type='NAME', value='foo')
Token(type='WS', value=' ')
Token(type='EQ', value='=')
Token(type='WS', value=' ')
Token(type='NUM', value='12')
Token(type='WS', value=' ')
Token(type='PLUS', value='+')
Token(type='WS', value=' ')
Token(type='NUM', value='5')
Token(type='WS', value=' ')
Token(type='TIMES', value='*')
Token(type='WS', value=' ')
Token(type='NUM', value='6')

過濾tokens流

接下來我們想要過濾掉空格標記,使用生成器表達式即可:

tokens = (tok for tok in generate_tokens(master_pat, "foo = 12 + 5 * 6")
          if tok.type != 'WS')
for tok in tokens:
    print(tok)

可以看到空格被成功過濾:

Token(type='NAME', value='foo')
Token(type='EQ', value='=')
Token(type='NUM', value='12')
Token(type='PLUS', value='+')
Token(type='NUM', value='5')
Token(type='TIMES', value='*')
Token(type='NUM', value='6')

注意子串匹配陷阱

tokens在正則表達式(即"|".join([NAME, EQ, NUM, PLUS, TIMES, WS]))中順序也非常重要。因為在進行匹配時,re模塊就會按照指定的順序?qū)δJ阶銎ヅ?。故若碰巧某個模式是另一個較長模式的子串時,必須保證較長的模式在前面優(yōu)先匹配。如下面分別展示正確的和錯誤的匹配方法:

LT = r'(?P<LT><)'
LE = r'(?P<LE><=)'
EQ = r'(?P<EQ>>=)'
master_pat = re.compile("|".join([LE, LT, EQ]))  # 正確的順序
master_pat = re.compile("|".join([LT, LE, EQ]))  # 錯誤的順序

第二種順序的錯誤之處在于,這樣會把'<='文本匹配為LT('<')緊跟著EQ('='),而沒有匹配為單獨的LE(<=)。

我們對于“有可能”形成子串的模式也要小心,比如下面這樣:

PRINT = r'(?P<PRINT>print)'
NAME = r'(?P<NAME>[a-zA-Z_][a-zA-Z_0-9]*)'
master_pat = re.compile("|".join([PRINT, NAME]))  # 正確的順序
for tok in generate_tokens(master_pat, "printer"):
    print(tok)

可以看到被print實際上成了另一個模式的子串,導致另一個模式的匹配出現(xiàn)了問題:

# Token(type='PRINT', value='print')
# Token(type='NAME', value='er')

更高級的語法分詞,建議采用像PyParsing或PLY這樣的包。特別地,對于英文自然語言文章的分詞,一般被集成到各類NLP的包中(一般分為按空格拆分、處理前后綴、去掉停用詞三步驟)。對于中文自然語言處理分詞也有豐富的工具(比如jieba分詞工具包)。

引用

[1] Martelli A, Ravenscroft A, Ascher D. Python cookbook[M]. " O'Reilly Media, Inc.", 2015. 數(shù)學是符號的藝術(shù),音樂是上界的語言。

到此這篇關(guān)于Python使用re模塊實現(xiàn)okenizer的文章就介紹到這了,更多相關(guān)Python okenizer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實現(xiàn)協(xié)程的具體示例

    python實現(xiàn)協(xié)程的具體示例

    協(xié)程是一種輕量級的并發(fā)編程技術(shù),它允許程序在某個點上暫停執(zhí)行,本文主要介紹了python實現(xiàn)協(xié)程的具體示例,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Python常用字符串替換函數(shù)strip、replace及sub用法示例

    Python常用字符串替換函數(shù)strip、replace及sub用法示例

    這篇文章主要介紹了Python常用字符串替換函數(shù)strip、replace及sub用法,結(jié)合實例形式分析了Python針對字符串替換的常用函數(shù)strip、replace及sub功能及簡單使用技巧,需要的朋友可以參考下
    2018-05-05
  • 使用Python如何將視頻按照一定時間切割(比如:每10s進行裁切)

    使用Python如何將視頻按照一定時間切割(比如:每10s進行裁切)

    這篇文章主要介紹了使用Python將視頻按照一定時間切割(比如:每10s進行裁切),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Python中reduce()函數(shù)的語法參數(shù)與作用詳解

    Python中reduce()函數(shù)的語法參數(shù)與作用詳解

    這篇文章主要介紹了Python中reduce()函數(shù)的語法參數(shù)與作用詳解,reduce函數(shù)是通過函數(shù)對迭代器對象中的元素進行遍歷操作,Python3.x中reduce函數(shù)已經(jīng)從內(nèi)置函數(shù)中取消了,轉(zhuǎn)而放在functools模塊中,需要的朋友可以參考下
    2023-08-08
  • Python解析m3u8拼接下載mp4視頻文件的示例代碼

    Python解析m3u8拼接下載mp4視頻文件的示例代碼

    這篇文章主要介紹了Python解析m3u8拼接下載mp4視頻文件的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 詳解Pandas 處理缺失值指令大全

    詳解Pandas 處理缺失值指令大全

    這篇文章主要介紹了詳解Pandas 處理缺失值指令大全,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • python處理文本文件并生成指定格式的文件

    python處理文本文件并生成指定格式的文件

    本節(jié)主要介紹了python如何處理文本文件并生成指定格式的文件,需要的朋友可以參考下
    2014-07-07
  • Python打印酷炫日志的方法詳解

    Python打印酷炫日志的方法詳解

    在Python中,日志是一種非常重要的工具,可以幫助我們更好地了解程序的運行情況,本文將介紹如何使用logging模塊來打印炫酷的日志,需要的可以參考一下
    2023-06-06
  • Python入門篇之數(shù)字

    Python入門篇之數(shù)字

    本文的主題是 Python 中的數(shù)字。會詳細介紹每一種數(shù)字類型,它們適用的各種運算符, 以及用于處理數(shù)字的內(nèi)建函數(shù)。在文章的末尾, 簡單介紹了幾個標準庫中用于處理數(shù)字的模塊。
    2014-10-10
  • 利用Python+Excel制作一個視頻下載器

    利用Python+Excel制作一個視頻下載器

    說起Excel,那絕對是數(shù)據(jù)處理領(lǐng)域王者般的存在。而作為網(wǎng)紅語言Python,在數(shù)據(jù)領(lǐng)域也是被廣泛使用。本文將利用Python和Excel制作一個視頻下載器,需要的可以參考一下
    2022-05-05

最新評論

恩平市| 常德市| 新泰市| 阜新市| 大埔区| 北宁市| 平邑县| 苏州市| 确山县| 三门峡市| 乡城县| 静宁县| 沿河| 南丰县| 利津县| 胶南市| 滕州市| 福海县| 特克斯县| 伊宁市| 嘉黎县| 三台县| 宁陵县| 龙南县| 海盐县| 天气| 宁强县| 揭东县| 明光市| 明溪县| 阜城县| 抚远县| 明星| 盐边县| 工布江达县| 山西省| 和静县| 东明县| 潞西市| 广平县| 南雄市|