掌握Python 正则表达式中的特殊字符

正则表达式是一种强大的文本模式匹配工具,常用于字符串的匹配、替换、分割等操作。Python内置re模块提供了丰富的正则表达式方法。但是,正则表达式中有许多特殊字符需要特殊处理,掌握这些特殊字符对于使用正则表达式是非常重要的。

一、元字符

元字符是正则表达式中最基本的概念。Python中最常用的元字符包括:.、^、$、*、+、?、{}、|、[]、()。下面我们详细说明这些元字符。

. (点号)

点号可以匹配任意单个字符,但是不能匹配换行符(\n)。例如,正则表达式 a.b 可以匹配字符串 “acb”、”a2b”、”a#b” 等,但不能匹配 “a
b”。

^ (脱字符)

脱字符匹配字符串的开头。例如,正则表达式 ^a 匹配以字母 a 开头的字符串,但是不能匹配 aaaaaa。

$ (美元符号)

美元符号匹配字符串的结尾。例如,正则表达式 a$ 匹配以字母 a 结尾的字符串,但是不能匹配 aaaaaa。

* (星号)

星号表示匹配前面的字符0次或多次。例如,正则表达式 a*b 可以匹配 “b”、”ab”、”aab” 等字符串。

+ (加号)

加号表示匹配前面的字符1次或多次。例如,正则表达式 a+b 可以匹配 “ab”、”aab” 等字符串,但是不能匹配字符串 “b”。

? (问号)

问号表示匹配前面的字符0次或1次。例如,正则表达式 a?b 可以匹配 “b” 和 “ab”两个字符串。

{m,n}

大括号表示匹配前面的字符m次到n次(包括m和n)。例如,正则表达式 a{2,4}b 可以匹配 “aab”、”aaab”、”aaaab” 三个字符串。

| (管道符号)

管道符号表示“或”关系。例如,正则表达式 a|b 可以匹配 “a” 或 “b”。

[] (字符集)

字符集表示匹配方括号中任意一个字符。例如,正则表达式 [abc] 表示匹配字符 “a”、”b” 或 “c”。

() (分组)

圆括号表示将其中的字符看成一个整体,可以在其中使用|、*、+、?、{}等元字符。例如,正则表达式 (ab)+ 可以匹配 “ab”、”abab”、”ababab” 等字符串。

二、转义字符

在正则表达式中,有些特殊字符需要用反斜杠进行转义才能正确匹配。Python中最常用的转义字符包括:\d、\D、\s、\S、\w、\W、\b、\B、\\。

\d

\d 表示匹配所有数字。例如,正则表达式 \d+ 可以匹配任意一个数字串。

\D

\D 表示匹配所有非数字字符。例如,正则表达式 \D+ 可以匹配任意一个非数字串。

\s

\s 表示匹配所有空白字符,包括空格、制表符、换行符等。例如,正则表达式 \s+ 可以匹配任意一个空白符串。

\S

\S 表示匹配所有非空白字符。例如,正则表达式 \S+ 可以匹配任意一个非空白符串。

\w

\w 表示匹配所有字母、数字和下划线。例如,正则表达式 \w+ 可以匹配任意一个标识符。

\W

\W 表示匹配所有非字母、数字和下划线的字符。例如,正则表达式 \W+ 可以匹配任意一个非标识符。

\b

\b 表示匹配单词的边界。例如,正则表达式\b\w+\b 可以匹配任意一个单词。

\B

\B 表示匹配非单词边界。例如,正则表达式\Bcat\B 可以匹配 “concat”、”cat123” 等字符串。

\\

用于转义字符本身。例如,正则表达式 \\+ 可以匹配一个反斜杠。

三、贪婪匹配和非贪婪匹配

正则表达式中的元字符默认是“贪婪”的,即尽可能多地匹配字符。例如,正则表达式 A.*B 可以匹配字符串 “A1B2C3D4B” 中的 A1B2C3D4。

非贪婪匹配也称为懒惰匹配或最小匹配,即尽可能少地匹配字符。在贪婪匹配的元字符后面加上?即可实现非贪婪匹配。例如,正则表达式 A.*?B 可以匹配字符串 “A1B2C3D4B” 中的 A1B2。

四、示例代码

import re

# 元字符示例
pattern = "a.b"
print(re.match(pattern, "acb")) # 匹配成功
print(re.match(pattern, "a 
b")) # 匹配失败 pattern = "^a" print(re.match(pattern, "abcd")) # 匹配成功 print(re.match(pattern, "bcda")) # 匹配失败 pattern = "a$" print(re.match(pattern, "abcd")) # 匹配失败 print(re.match(pattern, "bcda")) # 匹配成功 pattern = "a*b" print(re.match(pattern, "b")) # 匹配成功 print(re.match(pattern, "abab")) # 匹配成功 print(re.match(pattern, "c")) # 匹配失败 pattern = "a+b" print(re.match(pattern, "ab")) # 匹配成功 print(re.match(pattern, "aab")) # 匹配成功 print(re.match(pattern, "b")) # 匹配失败 pattern = "a?b" print(re.match(pattern, "b")) # 匹配成功 print(re.match(pattern, "ab")) # 匹配成功 print(re.match(pattern, "ac")) # 匹配失败 pattern = "a{2,4}b" print(re.match(pattern, "aab")) # 匹配成功 print(re.match(pattern, "aaab")) # 匹配成功 print(re.match(pattern, "aaaab")) # 匹配成功 print(re.match(pattern, "ab")) # 匹配失败 pattern = "a|b" print(re.match(pattern, "a")) # 匹配成功 print(re.match(pattern, "b")) # 匹配成功 print(re.match(pattern, "c")) # 匹配失败 pattern = "[abc]" print(re.match(pattern, "a")) # 匹配成功 print(re.match(pattern, "b")) # 匹配成功 print(re.match(pattern, "d")) # 匹配失败 pattern = "(ab)+" print(re.match(pattern, "ababab")) # 匹配成功 print(re.match(pattern, "ab")) # 匹配成功 print(re.match(pattern, "ac")) # 匹配失败 # 转义字符示例 pattern = "\d+" print(re.match(pattern, "123abc")) # 匹配成功 print(re.match(pattern, "abc")) # 匹配失败 pattern = "\D+" print(re.match(pattern, "123abc")) # 匹配失败 print(re.match(pattern, "abc")) # 匹配成功 pattern = "\s+" print(re.match(pattern, " abc")) # 匹配成功 print(re.match(pattern, "abc")) # 匹配失败 pattern = "\S+" print(re.match(pattern, " abc")) # 匹配失败 print(re.match(pattern, "abc")) # 匹配成功 pattern = "\w+" print(re.match(pattern, "def_123")) # 匹配成功 print(re.match(pattern, "!@#")) # 匹配失败 pattern = "\W+" print(re.match(pattern, "def_123")) # 匹配失败 print(re.match(pattern, "!@#")) # 匹配成功 pattern = r"\b\w+\b" print(re.findall(pattern, "Hello, world!")) # ['Hello', 'world'] pattern = r"\Bcat\B" print(re.search(pattern, "concat")) # None print(re.search(pattern, "cat123")) # None # 贪婪匹配和非贪婪匹配示例 pattern = "A.*B" print(re.match(pattern, "A1B2C3D4B")) # 匹配成功 pattern = "A.*?B" print(re.match(pattern, "A1B2C3D4B")) # 匹配成功

原创文章,作者:TDLP,如若转载,请注明出处:https://www.506064.com/n/138823.html

(0)
TDLPTDLP
上一篇 2024-10-04
下一篇 2024-10-04

相关推荐

  • 什么是adjclose?

    adjclose(Adjust Close)是指股票收盘价经过复权处理后的价格,它是股票历史数据中非常重要的一种价格。股票在上市交易时,其价格受到各种因素的影响,例如股息、分红、拆…

    编程 2024-10-04
  • js数据库建造(数据库如何建)

    本文目录一览: 1、怎么用node.js做一个比较简单的页面数据库操作 2、如何使用快速建造js 3、在asp.net中JS怎样操作数据库 4、在js中的数据怎么插入数据库 怎么用…

  • 前端js取cookie,js获取前端数据

    本文目录一览: 1、web 前端 js cookie 2、前台在JavaScript方法中怎样保存和提取Cookie 3、javascript怎么获取cookie 4、前端开发中 …

    编程 2024-10-04
  • Java运算符优先级详解

    Java运算符是程序员最常用的一组工具,在编写程序时,我们会用到各种运算符进行数据的处理。了解Java运算符的优先级是Java编程基础中不可或缺的一部分。本文从多个方面对Java运…

    编程 2024-10-12
  • 用途广泛的Python字典更新方法

    Python是一种高级编程语言,其内置了多种数据结构,其中最常用的之一是字典(dictionary)。字典是一种键-值对的数据结构,可以用来存储和查找信息。当我们需要更新字典时,有…

    编程 2024-10-04
  • OWASP Top 10安全风险

    OWASP Top 10是一个以十大常见网络安全风险为基础的指南,旨在为软件开发者、安全测试人员和安全研究人员提供有关最新和常见的安全威胁的信息。该指南按照严重性排序,并提供在开发…

    编程 2024-10-04
  • su怎么标注文字,su标注字体大小怎么改

    本文目录一览: 1、su怎么调古文字体 2、su弧形面上如何创建文字 3、su如何在球体面写字 4、su怎么在墙上写字 5、su快捷键命令大全 6、在sketchup8.0中怎么标…

    编程 2024-10-04
  • java同时访问多个sql的简单介绍

    本文目录一览: 1、有关在一个java程序中同时执行多个sql指令的问题,高手来看下! 2、在java比如说要运行两个sql.一个方法多个运行sql和一个方法一个sql哪个执行效率…

    编程 2024-10-03
  • ResNet18 结构分析

    一、概述 ResNet(残差神经网络)于 2015 年提出,是 ImageNet 图像分类任务上的冠军。其核心思想是通过引入跨层连接(shortcut connection)解决了…

    编程 2024-10-04
  • c操作mysql视频教程,mysql高级教程视频

    本文目录一览: 1、如何用C语言连接MYSQL数据库 2、用C语言如何对MySQL数据库进行操作 3、c语言怎么连接mysql数据库? 如何用C语言连接MYSQL数据库 1、配置O…

    编程 2024-10-03

发表回复

登录后才能评论