【自然语言处理】NLP入门(八):1、正则表达式与Python中的实现(8):正则表达式元字符:.、[]、^、$、*、+、?、{m,n}

news2024/7/4 5:14:09

文章目录

  • 一、前言
  • 二、正则表达式与Python中的实现
    • 1、字符串构造
    • 2、字符串截取
    • 3、字符串格式化输出
    • 4、字符转义符
    • 5、字符串常用函数
    • 6、字符串常用方法
    • 7、正则表达式
      • 1. `.`:表示除换行符以外的任意字符
      • 2. `[]`:指定字符集
      • 3. `^` :匹配行首,匹 ^后面的字符串
      • 4.`$`:匹配行尾,匹配$之前的字符串
      • 5. `\`:反斜杠后面可以加不同的字符以表示不同的特殊意义
      • 6. `*`:匹配重复 0 次或多次的字符
      • 7. `+`:匹配重复 1 次或多次的字符
      • 8. `?`:匹配 0 次或 1 次的字符
      • 9.“{m,n}”:表示至少有m个重复,至多有n个重复。m,n均为十进制数
      • 典例

一、前言

  本文将介绍正则表达式中常见的.[]^$*+?{m,n}等元字符。

二、正则表达式与Python中的实现

1、字符串构造

2、字符串截取

【自然语言处理】NLP入门(一):1、正则表达式与Python中的实现(1):字符串构造、字符串截取

3、字符串格式化输出

【自然语言处理】NLP入门(二):1、正则表达式与Python中的实现(2):字符串格式化输出(%、format()、f-string)

4、字符转义符

【自然语言处理】NLP入门(三):1、正则表达式与Python中的实现(3):字符转义符

5、字符串常用函数

  在Python中有很多内置函数可以对字符串进行操作。如len()ord()chr()max()min()bin()oct()hex()等。

自然语言处理】NLP入门(四):1、正则表达式与Python中的实现(4):字符串常用函数

6、字符串常用方法

  由于字符串属于不可变序列类型,常用方法中涉及到返回字符串的都是新字符串,原有字符串对象不变

【自然语言处理】NLP入门(五):1、正则表达式与Python中的实现(5):字符串常用方法:对齐方式、大小写转换详解

【自然语言处理】NLP入门(六):1、正则表达式与Python中的实现(6):字符串常用方法:find()、rfind()、index()、rindex()、count()、replace()

7、正则表达式

  正则表达式是一个特殊的字符序列,利用事先定义好的一些特定字符以及它们的组合组成一个“规则”,检查一个字符串是否与这种规则匹配来实现对字符的过滤或匹配。

  • Python中,re模块提供了正则表达式操作所需要的功能。
  • 元字符是一些在正则表达式中有特殊用途、不代表它本身字符意义的一组字符。
/^1[34578][0-9]$/

【自然语言处理】NLP入门(七):1、正则表达式与Python中的实现(7):常用正则表达式、re模块:findall、match、search、split、sub、compile

1. .:表示除换行符以外的任意字符

  • 与“.”类似(但不相同)的一个符号是“\S”,表示不是空白符的任意字符。注意是大写字符S
import re
s = 'hi, i am a student. my name is Hilton.'

# 匹配所有的i
print(re.findall(r'i', s))  # ['i', 'i', 'i', 'i']

# 匹配除换行符以外的任意字符
print(re.findall(r'.', s))  # ['h', 'i', ',', 'i', ' ', 'a', 'm', ' ', 'a', ' ', 's', 't', 'u', 'd', 'e', 'n', 't', '.', 'm', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 'H', 'i', 'l', 't', 'o', 'n', '.']

# 匹配i后面跟除换行符以外的任意字符的形式
print(re.findall(r'i.', s))  # ['i,', 'i ', 'is', 'il']

# 匹配i后面跟不是空白符的任意字符的形式
print(re.findall(r'i\S', s))  # ['i,', 'is', 'il']

在这里插入图片描述

2. []:指定字符集

  • []用来指定一个字符集,可以匹配字符集中的任何一个字符。
    • 例如[abc]表示匹配a、b或c中的任何一个字符;[a-z]表示匹配任意小写字母;[0-9]表示匹配任意数字字符。下面是一个关于它的示例:
  • 元字符在方括号中不起作用,例如:[akm$][m.]中元字符都不起作用;
  • 方括号内的^ 表示补集,匹配不在区间范围内的字符,例如:[^3]表示除3以外的字符。
import re
s = 'map mit mee mwt meqwt'

# 匹配'me'
print(re.findall(r'me', s))  # ['me', 'me']

# 匹配m后面跟i或者w再跟t形式
print(re.findall(r'm[iw]t', s))  # ['mit', 'mwt']

# 元字符“.”放在[]内,不起作用
print(re.findall(r'm[.]', s))  # []


s = '0x12x3x567x8xy'
print(re.findall(r'x[0123456789]x', s))  # ['x3x', 'x8x']
print(re.findall(r'x[0-9]x', s))  # ['x3x', 'x8x']
print(re.findall(r'x[^3]x', s))  # ['x8x']

在这里插入图片描述

3. ^ :匹配行首,匹 ^后面的字符串

  ^匹配行字符串的开始。在多行模式中,还匹配换行符后面的位置。

import re
s = 'hello hello world hello Mary hello John'
print(re.findall(r'hello', s))  # ['hello', 'hello', 'hello', 'hello']
print(re.findall(r'^hello', s))  # ['hello']

4.$:匹配行尾,匹配$之前的字符串

  $匹配行字符串的结尾。在多行模式中,还匹配换行符的前面的位置。

import re
s = 'hello hello world hello Mary hello John'
print(re.findall(r'hello$', s))  # []
s = 'hello hello world hello Mary hello'
print(re.findall(r'hello$', s))  # ['hello']
s = 'map mit mee mwt meqmtm$'
print(re.findall(r'm[aiw]$', s))  # []
print(re.findall(r'm[aiwt$]', s))  # ['ma', 'mi', 'mw', 'mt', 'm$']
print(re.findall(r'm[aiwt$]$', s))  # ['m$']

在这里插入图片描述

5. \:反斜杠后面可以加不同的字符以表示不同的特殊意义

  • \b:匹配单词的边界(单词的开头或结尾)
  • \B:与\b相反,匹配非单词的边界
  • \d:匹配任何十进制数字,相当于字符集 [0-9]
  • \D:与\d相反,匹配任何非数字字符,相当于 [^0-9]
  • \s:匹配任何空白字符,包括空格、制表符、换行符等,相当于字符集 [\t\n\r\f\v]
  • \S:与\s相反,匹配任何非空白字符,相当于 [^ \t\n\r\f\v]
  • \w:匹配任何字母、数字或下划线字符,相当于字符集 [a-zA-Z0-9_]
  • \W:与\w相反,匹配任何非字母、数字和下划线字符,相当于 [^a-zA-Z0-9_]
import re
s = '0x12x3x567x8xy'

# 使用字符集匹配数字
print(re.findall(r'[0-9]', s))  
# ['0', '1', '2', '3', '5', '6', '7', '8']

# 使用\d匹配数字
print(re.findall(r'\d', s))  
# ['0', '1', '2', '3', '5', '6', '7', '8']

# 匹配字母“x”或数字
print(re.findall(r'[x\d]', s))  
# ['0', 'x', '1', '2', 'x', '3', 'x', '5', '6', '7', 'x', '8', 'x']

  正则表达式除了能够匹配定长的字符集,还能匹配不定长的字符集、这需要指定正则表达式的一部分的重复次数,所涉及的元字符有*+?{}

6. *:匹配重复 0 次或多次的字符

import re
s = 'a ab abbbbb abbbbbxa'
print(re.findall(r'ab*', s))  
# ['a', 'ab', 'abbbbb', 'abbbbb', 'a']

注意:
  匹配abbbbb(5个b),为什么不匹配abbbb(4个b)、abbb(3个b)、abb(2个b)?(abbbbb的字串)

  • 0次或多次出现,贪心算法~匹配最长的

7. +:匹配重复 1 次或多次的字符

import re
s = 'a ab abbbbb abbbbbxa'
print(re.findall(r'ab+', s))  
# ['ab', 'abbbbb', 'abbbbb']

8. ?:匹配 0 次或 1 次的字符

  • 当“?”紧随其他限定符(*、+、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。
import re
s='a ab abbbb abbbbbxa'
re.findall(r'ab+',s) #最大模式、贪心模式
# ['ab', 'abbbb', 'abbbbb']
re.findall(r'ab+?',s) #最小模式、非贪心模式
# ['ab', 'ab', 'ab']
  • 实验 :两个问号是否就是彻底不贪心的了???
    • 错误的:在正则表达式中,两个问号 "??” 是语法错误,在正则表达式中使用两个问号 "??” 是无效的。

9.“{m,n}”:表示至少有m个重复,至多有n个重复。m,n均为十进制数

  • 忽略m表示0个重复,忽略n表示无穷多个重复。
  • {0,}等同于*;{1,}等同于+;{0,1}与?相同。
    • 但是如果可以的话,最好使用*、+、或?
import re
s = '021-33507yyx,021-33507865,010-12345678,021-123456789'
print(re.findall(r'021-\d{8}', s))  
# ['021-33507865', '021-12345678']
print(re.findall(r'\b021-\d{8}\b', s))  
# ['021-33507865']

典例

  随机产生10个长度为1~25之间,由字母、数字、和“_”“.”“#”“%”特殊字符组成的字符串构成列表,找出列表中符合下列要求的字符串:长度为5-20,必须以字母开头、可带数字、“_”“.”

import re
import random
import string

def generate_random_string(length):
    characters = string.ascii_letters + string.digits + "_.#%"
    return ''.join(random.choice(characters) for _ in range(length))

random_strings = [generate_random_string(random.randint(1, 25)) for _ in range(10)]
print("随机生成的字符串列表:", random_strings)

filtered_strings = [s for s in random_strings if re.match(r"^[a-zA-Z][a-zA-Z0-9_.]{4,19}$", s)]
print("符合条件的字符串列表:", filtered_strings)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1533157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯练习题总结(二)dfs题、飞机降落、全球变暖

一、飞机降落 问题描述: N架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 个单位时间,即它最早可以于 1, 时刻开始降落,最晚可以于时刻开始降落。降落过程需要个…

mysql笔记:24. 主从同步环境搭建

文章目录 主从同步的基本原理主从同步的搭建步骤1. 环境准备2. 配置主服务器(Master)3. 配置从服务器(Slave)4. 测试配置5. 常见故障5.1. 主从服务器上的MySQL版本不一致导致失败?5.2. Slave_IO_Running状态异常&#…

AI颠覆教学系统,ChatGPT对应试教育会带来哪些挑战?

ChatGPT爆火两个月,整个教育系统都在被颠覆。在全美范围内,许多大学教授、系主任和管理人员,都在对课堂进行大规模的调整,以应对ChatGPT对教学活动造成的巨大冲击。 我们的传统中高考选出的分霸,是更能吃苦&#xff0…

开发技术-FeignClient 对单个接口设置超时时间

1. 背景 FeignClient 调用某个接口,3s 没有结果就需要停止,处理后续业务。 2. 方法 FeignClient 自定义 name 属性 FeignClient(name "aaa" , url "xxx") public interface TestApi {ResponseBodyPOSTMapping(value "xx…

设计模式之抽象工厂模式解析

抽象工厂模式 1)问题 工厂方法模式中的每个工厂只生产一类产品,会导致系统中存在大量的工厂类,增加系统的开销。 2)概述 a)产品族 和 产品等级结构 产品等级结构:产品的继承结构; 产品族&…

TnT-LLM: Text Mining at Scale with Large Language Models

TnT-LLM: Text Mining at Scale with Large Language Models 相关链接:arxiv 关键字:Large Language Models (LLMs)、Text Mining、Label Taxonomy、Text Classification、Prompt-based Interface 摘要 文本挖掘是将非结构化文本转换为结构化和有意义的…

Java开发---上海得帆(一面)

面试感受 这是我的第一次面试,我感觉我这次面试的很差,很糟糕,十分的糟糕,万分的糟糕。第一次面试,面试了半个小时。我去真的好紧张,脑子里一篇空白。脑子空白还不是最惨的,最惨的是那个八股文…

使用Lerna搭建业务组件库

Lerna基本概念 Lerna 是一个用来优化托管在 git\npm 上的多 package 代码库的工作流的一个管理工具,可以让你在主项目下管理多个子项目,从而解决了多个包互相依赖,且发布时需要手动维护多个包的问题。 主要功能: 为单个包或多个包运行命令 …

【GPT概念-03】:人工智能中的注意力机制

说明 注意力机制生成分数(通常使用输入函数),确定对每个数据部分的关注程度。这些分数用于创建输入的加权总和,该总和馈送到下一个网络层。这允许模型捕获数据中的上下文和关系,而传统的固定序列处理方法可能会遗漏这…

JVM垃圾收集器你会选择吗?

目录 一、Serial收集器 二、ParNew收集器 三、Paralle Scavenge 四、Serial Old 五、Parallel Old 六、CMS收集器 6.1 CMS对处理器资源非常敏感 6.2 CMS容易出现浮动垃圾 6.3 产生内存碎片 七、G1 收集器 八、如何选择合适的垃圾收集器 JVM 垃圾收集器是Java虚…

走迷宫---dfs在矩阵图里的应用模板

题目描述如下: dfs算法解决迷宫问题的一个标准模板 ,通过递归与回溯暴力遍历所有能走的点,并比较找出所有可行方案的最优解 解决这道问题的核心思想和组合数如出一辙,可以说是组合数的升级版 结合注释看dfs更清晰易懂&#xff0…

群晖HomeAssistant安装HACS插件商店结合内网穿透实现公网访问本地智能家居

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant,通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店,将米家,果家设备接入 Home Assistant。 基本条件…

微博修改密码后无法通过微博开放接口发送微博

生产环境,因密码修改导致授权失效致接口发送微博失效!内部网站编辑完博文后无法发送微博。在修改密码时,有提示授权应用失效,操作人员不清晰情况,直接忽视。 微博应用开放接口----》微博转发博文接口文档 无示例 遗憾…

LabVIEW提升舱救援通讯监测系统

LabVIEW提升舱救援通讯监测系统 随着科技的进步,煤矿救援工作面临着许多新的挑战。为了提高救援效率和安全性,设计并实现了一套基于LabVIEW的提升舱救援通讯监测系统。该系统能够实时监控提升舱内的环境参数和视频图像,确保救援人员和被困人…

AI程序员诞生:对程序员的影响与未来展望

🍎个人博客:个人主页 🏆个人专栏:日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 方向一:AI程序员的优势分析 方向二:AI程序员局限性 方向三:对程序员职业的影响 方向四&…

会员项目定价卡css3特效

会员项目定价卡css3特效,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面 下载地址 会员项目定价卡css3特效代码

2024年了,还能学自动化吗?

大家都说2024年软件测试行业会卷的更厉害,简单的功能测试不再是入门的标准,那么2024年是否可以从自动化测试这块冲一把呢? 我们先来看看过去的一年自动化测试在测试行业中的发展分析: 01 市场需求增长 随着技术的进步和企业对软件…

流畅的 Python 第二版(GPT 重译)(十一)

第二十章:并发执行器 抨击线程的人通常是系统程序员,他们心中有着典型应用程序员终其一生都不会遇到的用例。[…] 在 99%的用例中,应用程序员可能会遇到的情况是,生成一堆独立线程并将结果收集到队列中的简单模式就是他们需要了解…

SpringBoot-03 | SpringBoot自动配置

SpringBoot-03 | SpringBoot自动配置 原理分析代码示例源码剖析SpringBootConfiguration:组合注解,标记当前类为配置类ComponentScanEnableAutoConfigurationImport加载spring.factoriesrun初始化加载spring.factoriesspring.factories中的钩子类 网上盗…

流畅的 Python 第二版(GPT 重译)(八)

第十五章:关于类型提示的更多内容 我学到了一个痛苦的教训,对于小程序来说,动态类型很棒。对于大型程序,你需要更加纪律严明的方法。如果语言给予你这种纪律,而不是告诉你“嗯,你可以做任何你想做的事情”&…