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

文章目录

  • 一、前言
  • 二、正则表达式与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.mfbz.cn/a/474256.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux中,运行程序,顺便将打印信息存储在Log文件中查看

前言 如题,原本打算在代码中自己写一个类去管理将打印信息收集到log日志中,忽然想到,其实也可以写sh脚本 简单demo1 #!/bin/bash# 启动应用程序 test,并将标准输出和标准错误输出都追加到 log 文件中 ./test >> output.log…

基于Java中的SSM框架实现高校毕业设计管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现高校毕业设计管理系统演示 摘要 现代学校的教学规模逐渐增加,需要处理的信息量也在增加。每年毕业,将会有大量的毕业设计要处理。传统的毕业设计管理方法已不能满足师生的需求。教师和学生需要一个简单方便的系统来取代传统的机…

FPGA学习_Xilinx7系列FPGA基本结构

文章目录 前言一、7系列FPGA介绍1.1、芯片编号 二、基本组成单元2.1、可编程逻辑块CLB(Configable Logic Block)2.2、可编程输入输出单元(IOB)2.3、嵌入式块RAM(Block RAM)2.4、底层内嵌功能单元2.5、内嵌专…

【2】华为交换机如何修改Web登录密码?

0x01 问题描述 如果忘记了Web登录密码或者希望修改Web登录密码&#xff0c;用户可以通过Console口、STelnet或Tenet等方式登录交换机后设置新的Web登录密码。 使用Telnet协议存在安全风险&#xff0c;建议使用Console囗或STelnet V2登录设备 0x02 问题解决 <HUAWEI> s…

Linux信号补充——信号发送和保存

三、信号的发送与保存 3.1信号的发送 ​ 必须有操作系统来保存信号&#xff0c;因为他是管理者&#xff1b; ​ 信号给进程的task_struct发送信号&#xff0c;在task_struct中维护了一个整数signal有0-31位&#xff0c;共32个bit位&#xff1b;对于信号的管理使用的是位图结…

线段树优化dp

abc339 E - Smooth Subsequence 思路&#xff1a;我们很容想到一个 n n n方的的状态转移方程&#xff0c;即对于每个i&#xff0c;我们去枚举 1 1 1到 i − 1 i-1 i−1的状态&#xff0c;即 d p [ i ] m a x ( d p [ i ] , d p [ j ] 1 ) ; dp[i]max(dp[i],dp[j]1); dp[i]ma…

Vue字符串里的中文数字转换为阿拉伯数字

js字符串里的中文数字转换为数字 <template><view><view><view class"inpbox" ><textarea v-model"voiceMane" input"convert" ></textarea></view></view></view> </template> &…

3.7 RK3399项目开发实录-板载OpenWRT系统的使用(wulianjishu666)

STM32F103单片机从零到项目开发程序实例 下载链接&#xff1a;https://pan.baidu.com/s/1dWNskNinrMk4bxaE-jgHhQ?pwdymn3 1. OpenWRT 手册 1.1. 支持设备列表 主控板卡型号RK3568ROC-RK3568-PC/Station-P2 1.2. 登录 IP 、登录密码和 WIFI 名称 固件默认登录 IP 为 192.1…

Linux Ncurses库部分函数使用说明

目录 1. initscr&#xff08;&#xff09;函数 2. endwin&#xff08;&#xff09;函数 3. curs_set()函数 4.noecho()函数 5. keypad()函数 6. start_color()函数 7.init_pair()函数 8.getch()函数 9.move()函数 10.addch()函数 11. refresh()函数 12.inch()函数…

【Linux 进程概念】

【Linux 进程概念】 冯诺依曼体系结构冯诺依曼结构简要解释&#xff1a;你用QQ和朋友聊天时数据的流动过程 操作系统(OperatorSystem)概念设计OS的目的定位操作系统的上下层都分别是什么如何理解“管理"总结 进程基本概念描述进程-PCBtask_ struct内容 组织进程查看进程通…

序列化与反序列化介绍

文章目录 一、序列化与反序列化二、PHP反序列化漏洞成因三、JAVA反序列化 一、序列化与反序列化 在PHP语言开发层面上基本都是围绕着serialize()&#xff0c;unserialize()这两个函数。serialize()函数序列化对象后&#xff0c;可以很方便的将它传递给其他需要它的地方&#x…

由浅到深认识Java语言(9):Eclipse IDE简介

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

【蓝桥杯入门记录】继电器、蜂鸣器及原理图分析

一、继电器、继电器概述 &#xff08;1&#xff09;蜂鸣器原理 蜂鸣器的发声原理由振动装置和谐振装置组成&#xff0c;而蜂鸣器又分为无源他激型与有源自激型&#xff0c;蜂鸣器的发声原理为: 1、无源他激型蜂鸣器的工作发声原理是&#xff1a;方波信号输入谐振装置转换为声…

稀碎从零算法笔记Day23-LeetCode:二叉树的最大深度

题型&#xff1a;链表、二叉树的遍历 链接&#xff1a;104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上…

ES集群不识别节点SSL证书的问题处理

问题描述 在启动ES服务并试图加入其他节点上已启动的集群时&#xff0c;出现报错(原文是一大段话&#xff0c;我按语义拆成了几段)&#xff1a; [2024-03-19T16:32:02,844][WARN ][o.e.c.s.DiagnosticTrustManager] [node-2-master] failed to establish trust with server a…

高压线下垂钓很危险!高压线下防垂钓智能语音警示杆:科技守护生命

初春时节&#xff0c;气温逐渐回升&#xff0c;在这阳光明媚的日子里&#xff0c;大批“捕鱼达人”纷纷开始行动&#xff0c;河边、池塘、水库……不放过任何一个垂钓点&#xff0c;甚至在高压线下&#xff0c;依旧自信甩杆&#xff0c;殊不知高压线下垂钓&#xff0c;轻则伤、…

聚类算法之层次聚类(Hierarchical Clustering)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 层次聚类是一种非常独特和强大的聚类方法&#xff0c;与众多其他的聚类技术相比&#xff0c;它不仅为数据集提供了一个划分&#xff0c;还给出了…

鸿蒙APP应用开发教程—超详细的项目结构说明

1. 新建项目 打开DevEco Studio, 选择 Create Project: 1.1 选择模版 Create Project - Choose Template 1.2 配置项目 Create Project - Configure Project 如果使用的是 DevEco 3.X 版本, 可以根据 Compile SDK版本选择不同的模式, 比如: 3.0.0(API 8)及更早 - 仅支持 …

【数据结构】堆和树详解堆和二叉树的实现堆的top-k问题

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;数据结构_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.树概念及结构 1.1 树的概念 2.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用 2.二叉树的概念及结构 2.1 二叉树的概念…

力扣389周赛复盘

字符串及其反转中是否存在同一子字符串 class Solution {public boolean isSubstringPresent(String s) {StringBuilder sb new StringBuilder(s);String reverse sb.reverse().toString(); for (int i 0; i < s.length() - 2; i) { // 修改循环终止条件为 <&#xf…