iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中如何使用re模块实现okenizer
  • 322
分享到

Python中如何使用re模块实现okenizer

2023-06-30 12:06:28 322人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“python中如何使用re模块实现okenizer”,在日常操作中,相信很多人在Python中如何使用re模块实现okenizer问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中

这篇文章主要介绍“python中如何使用re模块实现okenizer”,在日常操作中,相信很多人在Python中如何使用re模块实现okenizer问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中如何使用re模块实现okenizer”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一个简单的tokenizer

分词(tokenization)任务是Python字符串处理中最为常见任务了。我们这里讲解用正则表达式构建简单的表达式分词器(tokenizer),它能够将表达式字符串从左到右解析为标记(tokens)流。

给定如下的表达式字符串:

text = 'foo = 12 + 5 * 6'

我们想要将其转换为下列以序列对呈现的分词结果:

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

要完成这样的分词操作,我们首先需要定义出所有可能的标记模式(所谓模式(pattern),为用来描述或者匹配/系列匹配某个句法规则的字符串,这里我们用正则表达式来做为模式),注意此处要包括空格whitespace,否则字符串中出现任何模式中没有的字符后,扫描就会停止。因为我们还需要给标记以NAME、EQ等名称,我们采用正则表达式中的命名捕获组来实现。

import reNAME = r'(?P<NAME>[a-zA-Z_][a-zA-Z_0-9]*)' # 这里?P<NAME>表示模式名称,()表示一个正则表达式捕获组,合在一起即一个命名捕获组EQ = r'(?P<EQ>=)'NUM = r'(?P<NUM>\d+)' #\d表示匹配数字,+表示任意数量PLUS = r'(?P<PLUS>\+)' #需要用\转义TIMES = r'(?P<TIMES>\*)' #需要用\转义WS = r'(?P<WS>\s+)' #\s表示匹配空格, +表示任意数量master_pat = re.compile("|".join([NAME, EQ, NUM, PLUS, TIMES, WS]))  # | 用于选择多个模式,表示"或"

接下来我们用模式对象中的scanner()方法来完成分词操作,该方法创建一个扫描对象:

scanner = master_pat.scanner(text)

然后可以用match()方法获取单次匹配结果,一次匹配一个模式:

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

当然这样一次一次调用过于麻烦,我们可以使用迭代器来批量调用,并将单次迭代结果以具名元组形式存储

Token = namedtuple('Token', ['type', 'value'])def generate_tokens(pat, text):    scanner = pat.scanner(text)    for m in iter(scanner.match, None):        #scanner.match做为迭代器每次调用的方法,        #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模块就会按照指定的顺序对模式做匹配。故若碰巧某个模式是另一个较长模式的子串时,必须保证较长的模式在前面优先匹配。如下面分别展示正确的和错误的匹配方法:

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实际上成了另一个模式的子串,导致另一个模式的匹配出现了问题:

# 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. 数学是符号的艺术,音乐是上界的语言。

到此,关于“Python中如何使用re模块实现okenizer”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Python中如何使用re模块实现okenizer

本文链接: https://www.lsjlt.com/news/328527.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中如何使用re模块实现okenizer
    这篇文章主要介绍“Python中如何使用re模块实现okenizer”,在日常操作中,相信很多人在Python中如何使用re模块实现okenizer问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中...
    99+
    2023-06-30
  • Python使用re模块实现okenizer(表达式分词器)
    目录一个简单的tokenizer过滤tokens流注意子串匹配陷阱引用一个简单的tokenizer 分词(tokenization)任务是Python字符串处理中最为常见任务了。我们...
    99+
    2024-04-02
  • 怎么在python中使用re模块
    本篇文章为大家展示了怎么在python中使用re模块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其...
    99+
    2023-06-14
  • Python常用模块re的使用
    一.re模块的查找方法:  1.findall 匹配所有每一项都是列表中的一个元素 import reret = re.findall('\d+','asd鲁班七号21313') # 正则表达式,待匹配的字符串,flag# ret ...
    99+
    2023-01-31
    模块 常用 Python
  • Python技法之如何用re模块实现简易tokenizer
    目录一个简单的tokenizer过滤tokens流注意子串匹配陷阱引用 总结一个简单的tokenizer 分词(tokenization)任务是Python字符串处理中最为...
    99+
    2024-04-02
  • Python怎么用re模块实现简易tokenizer
    这篇文章主要介绍“Python怎么用re模块实现简易tokenizer”,在日常操作中,相信很多人在Python怎么用re模块实现简易tokenizer问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Pytho...
    99+
    2023-06-30
  • Python正则表达中re模块的使用
    目录01、正则表达式1.1、限定匹配数量规则1.2、原生字符串1.3、分组匹配1.4、编译函数compile1.5贪婪模式和非贪婪模式01、正则表达式 学习正则表达式操作字符串,re...
    99+
    2024-04-02
  • Python利用re模块实现简易分词(tokenization)
    目录一个简单的tokenizer过滤tokens流注意子串匹配陷阱一个简单的tokenizer 分词(tokenization)任务是Python字符串处理中最为常见任务了。我们这里...
    99+
    2024-04-02
  • Python中re模块的元字符使用小结
    目录类别1:匹配单个字符的元字符方括号( [] ) 字符集点 ( . ) 通配符\w 和 \W 单词字符匹配\d 和 \D 字符十进制数字匹配\s 和 \S 字符空格匹配混合使用 \...
    99+
    2024-04-02
  • Python中re模块的元字符怎么使用
    这篇文章主要介绍“Python中re模块的元字符怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中re模块的元字符怎么使用”文章能帮助大家解决问题。元字符(Meta Charact...
    99+
    2023-06-29
  • Python怎么利用re模块实现简易分词
    本文小编为大家详细介绍“Python怎么利用re模块实现简易分词”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python怎么利用re模块实现简易分词”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一个简单的to...
    99+
    2023-06-30
  • Python使用re模块实现正则表达式操作指南
    目录一、前言二、匹配字符串1.使用match()方法进行匹配2.使用search()方法进行匹配3.使用findall()方法进行匹配三、替换字符串四、使用正则表达式分割字符串总结&...
    99+
    2024-04-02
  • Python中re模块基本用法解析
    基于Python的正则表达式, 使用re模块: 1. match()方法, 从字符串头部开始匹配 import re content = 'The 123456 is my one phone number.' print(le...
    99+
    2023-01-31
    模块 Python
  • python正则表达式re模块怎么使用
    这篇文章主要介绍“python正则表达式re模块怎么使用”,在日常操作中,相信很多人在python正则表达式re模块怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python正则表达式re模块怎么使用...
    99+
    2023-07-02
  • Python中re模块的常用方法总结
    前言 正则表达式作为计算机科学的一个概念,通常被用来检索、替换那些符合某个规则的文本。正则表达式是对字符串操作的一种逻辑公式,用事先定义好的规则字符串对字符串进行过滤逻辑处理。 re...
    99+
    2024-04-02
  • Python中re模块常用方法总结分析
    re.findall() 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。 语法格式: re.findall(pattern, stri...
    99+
    2024-04-02
  • 如何分析Python正则表达式re模块
    本篇文章为大家展示了如何分析Python正则表达式re模块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。简介正则表达式(regular expression)是可以匹配文本片段的模式。最简单的正则表...
    99+
    2023-06-17
  • Python中base64模块如何使用
    Python中base64模块如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python base64模块是用来作base64编码解码的。这种编码方式在...
    99+
    2023-06-17
  • Python使用Paramiko模块实现
    paramiko是用python写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输以及远程命令执行。 通过安装包安装: wget ...
    99+
    2023-01-31
    模块 Python Paramiko
  • python正则表达式(re模块)的使用详解
    目录前言re.match函数匹配单个字符匹配多个字符匹配开头结尾匹配分组re.compile 函数re.search函数re.findall函数re.finditer函数re.sub...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作