python基础 — 正则表达式

 一、转义字符

1、转义字符介绍

首先,转义字符不是python这门语言所独有的,准确的讲,这是一个计算机专业词汇。在Python中,转义字符是以反斜杠(\)开头的特殊字符序列,在反斜杠后面添加特定字符来,用来表示一些无法直接键入或显示的字符。

1. 显示特殊字符:例如,在字符串中要输出引号、换行符,或制表符,这些字符无法被直接输入。使用转义字符可以确保Python正确地识别这些字符并将它们正确的显示和处理。

2. 提高代码可读性:长字符串可能会包含多行文本,为了让代码更整洁或易读,可以使用换行符`\n`来分割这些文本,并插入到代码中的适当位置。转义字符使字符串符合PEP8规范,增强了代码的可读性。

3. 创建正则表达式:正则表达式通常包含特殊字符,例如方括号、大括号、竖线等等,使用转义字符可以将这些字符正确表示出来,帮助我们编写更强大和灵活的字符串匹配算法。

4. 以防止语法错误:像单引号和双引号之类的特殊字符在Python中具有特殊含义。如果需要在一个字符串中放置引号,那么需要对其中一个字符进行转义,否则Python无法区分这些字符与字符串的开始和结束。

总之,使用转义字符可以允许我们在Python中生成或处理各种类型的特殊字符,并提高代码可读性,避免语法错误,并帮助我们更好地编写正则表达式。

2、转义字符种类

转义字符说明
\\反斜杠
\n换行符,将光标位置移到下一行开头。
\t制表符,也即 Tab 键,一般相当于四个空格。
\'单引号
\"双引号
\r回车符,将光标位置移到本行开头。
\b退格(Backspace),将光标位置移到前一列。
\a蜂鸣器响铃。注意不是喇叭发声,现在的计算机很多都不带蜂鸣器了,所以响铃不一定有效。

需要注意的是“r” 原生字符,修饰的字符串不做转义。

3、转义字符"\"和原生字符"r"的区别

在Python中,反斜杠“\”是一个转义字符,用于表示一些特殊的字符。有时候,我们需要在字符串中使用一些包含反斜杠字符的特殊符号,例如换行符“\n”、制表符“\t”等等,此时就需要通过反斜杠进行转义。而在某些情况下,我们需要在字符串中表示反斜杠本身,这时候就需要使用两个反斜杠“\\”,第一个反斜杠用于转义第二个反斜杠,让其显示为普通字符。

相比之下,原始字符串(r-string)则不会对任何字符进行转义,其中的反斜杠字符可以被当做普通字符处理。在定义一个包含文件路径、正则表达式或其他类似格式的字符串时,使用原始字符串可能更加方便,因为可以避免手动进行转义并且增加代码可读性。在定义一个原始字符串时,在字符串开头加上'r'或'R'即可。

以下是一个示例,来说明反斜杠和原始字符串的使用区别:

# 反斜杠转义
print("Hello\nworld!")    # 输出:Hello(换行)world!
print("C:\\Users\\Admin\\Desktop")    # 输出:C:\Users\Admin\Desktop

# 原始字符串
print(r"Hello\nworld!")    # 输出:Hello\nworld!
print(r"C:\Users\Admin\Desktop")    # 输出:C:\Users\Admin\Desktop

在上面的代码中,我们使用反斜杠进行字符串转义来显示换行符和路径分隔符。然后我们使用原始字符串方式定义了相同含义的字符串,此时就不需要对任何字符进行转义了。

4、转义字符用法实例

(1)反斜杠\\

在Python中,双反斜杠"\\"是一个转义字符,用于代表一个普通的反斜杠字符“\”。所以可以使用双反斜杠"\\"来表示文件路径中的单个反斜杠。以下是一个示例,假设有一个名为“example.txt”的文件存储在“C:\Users\Username\Folder”目录下:

file_path = "C:\\Users\\Username\\Folder\\example.txt"

在此示例中,我们使用了双反斜杠"\\"来转义每个单独的反斜杠,从而正确表示文件路径。通过以上方式,我们能够确保所有的应用程序都能够正确读取和解析文件路径,并有效地进行各种操作,例如读取或写入文件。

此外,还可以使用原始字符串(r"Path")的方法来处理含有文件路径的字符串,使得字符串中的反斜杠自动被解释为文本中实际的反斜杠,而无需手动进行转义。

file_path = r"C:\Users\Username\Folder\example.txt"

二、正则表达式

1、正则表达式介绍

正则表达式(Regular Expression)是一种用于匹配、搜索、替换和验证文本的强大工具,它使用特定的语法来描述匹配模式。

正则表达式由字符和特殊字符组成,用于描述要匹配的文本模式。它可以用于验证、搜索、替换和提取文本数据。通过使用不同的元字符和特殊字符,可以定义匹配规则,如匹配特定字符、字符集合、重复次数、位置等。

正则表达式的确广泛应用于文本处理、数据清洗、表单验证、日志分析等场景中。它可以帮助我们有效地匹配、搜索、替换和提取文本数据。例如,在文本处理中,可以使用正则表达式来查找和替换特定模式的文本;在数据清洗中,可以使用正则表达式来验证和清理数据格式;在表单验证中,可以使用正则表达式来验证用户输入的合法性;在日志分析中,可以使用正则表达式来提取关键信息或匹配特定的日志模式。

需要注意的是,正则表达式是一种跨语言的通用工具,在很多编程语言和工具中都有支持,包括Java、Python、JavaScript等。

例如,正则表达式`\d{4}`可以匹配四个连续的数字,`\w+`可以匹配一个或多个字母、数字或下划线字符,`[A-Za-z]+`可以匹配一个或多个字母等。

2、正则表达式语法结构

正则表达式(Regular Expression)是由普通字符、特殊字符(元字符)和修饰符(可选)组成。

(1)普通字符:

正则表达式中的普通字符指的是那些不具有特殊含义的字符,可以直接匹配相应的文本。比如字母、数字、标点符号等。

(2)特殊字符(元字符):

元字符说明
.匹配除换行符外任意单个字符
^匹配输入字符串的开始位置。
$匹配输入字符串的结束位置。
*匹配前一个字符0次或多次,类似“贪心算法”。
+匹配前一个字符1次或多次,类似“贪心算法”。
?匹配前一个字符0次或1次,类似“非贪心算法”。
\转义字符,用于转义正则表达式元字符。
|用于枚举分隔多个模式,表示“或”的意思,类似于逻辑运算符中的“或”(例如 pattern1|pattern2 匹配 pattern1 或 pattern2)。
[]定义匹配一个字符集,只要其中的任何一个字符被匹配即可。(例如[a-z],表示任何小写字母)
{}它用于匹配指定次数的重复字符或者字符类。如:\d{3} 表示任意数字字符出现3次
()用于聚合正则表达式

(3)修饰符:

修饰符则是正则表达式中的一个选项,用来控制正则表达式的匹配行为。常用的修饰符有以下几种:

  1. i:忽略大小写匹配,即不区分大小写。

  2. g:全局匹配模式,返回所有匹配项,而不仅仅是第一个。

  3. m:多行匹配模式,^ 和 $ 能够匹配一行的开始和结束位置,而不是字符串的开头和结尾。

需要注意的是,修饰符放在正则表达式的末尾,有些修饰符是可以组合使用的,也可以同时使用多个修饰符。

例如,/hello/i 就是在匹配字符串时忽略大小写;/hello/g 则是找出所有满足匹配条件的字符串;/^hello$/m 可以匹配多行文本中以 hello 开始并已 hello 结束的行。

掌握修饰符可以让我们更加灵活地使用正则表达式进行字符串匹配和处理,适应更加复杂的业务需求。

3、正则表达式的元字符详细说明

(1)元字符 '.'

元字符 '.' 是正则表达式中表示匹配任意单个字符的通配符(Wildcard character)。它可以匹配除了换行符 \n 以外的任何单个字符。

(2)元字符 `^` 和 `$`

元字符 `^` 和 `$` 都是正则表达式中的限制匹配位置的元字符。

- `^` 表示匹配一个字符串的起始位置。
- `$` 表示匹配一个字符串的终止位置。

举个例子,假如我们需要匹配一个由数字构成的四位字符串,可以这样写:

^\d{4}$

其中,`^\d{4}$` 表示从字符串的开头到结尾匹配四个数字的字符串。这一正则表达式首先使用 `^` 匹配整个字符串的起始位置,然后在正则表达式的其他部分使用 `\d{4}` 匹配四个数字,最后使用 `$` 匹配整个字符串的终止位置。

需要注意的是,当 `^` 和 `$` 中间不加任何字符时,它们对应的正则表达式表示空字符串,否则就表示从字符串的开始或结束位置开始匹配相应的模式。此外,需要特别注意 Python 正则表达式中可能包含转义字符,因此需要使用原始字符串(Raw String)来表示正则表达式。

总之,`^` 和 `$` 元字符对于限制正则表达式的匹配位置非常有用,在实际应用中经常用来匹配特定格式的字符串。

(3)元字符 '*', '+', '?'

元字符 *+? 都是正则表达式中的重复量词元字符,用来表示一个模式中前一个字符或子表达式出现的次数。

  • * 表示重复0次或多次。
  • + 表示重复1次或多次。
  • ? 表示重复0次或1次(可选项)。

例如:

ca*t 将匹配 'ct' (0个 'a' 字符),'cat' (1个 'a' ), 'caaat' (3个 'a' 字符),等等。

ca+t 将匹配 'cat' (1 个 'a'),'caaat' (3 个 'a'),等等,但不会匹配 'ct'

ca?t 将匹配  'ct' (0个 'a' 字符),'cat' (1个 'a' )。

(4)元字符 '\'

在正则表达式中,反斜杠符号 `\` 是一个非常重要的元字符。它可以改变其后面字符的含义,使其具有特殊的意义。

下面是一些常用的以 `\` 为前缀的元字符及其含义:

- `\d`:匹配任意数字字符,等价于 `[0-9]`。
- `\D`:匹配任意非数字字符,等价于 `[^0-9]`。
- `\w`:匹配任何字母数字字符,等价于 `[a-zA-Z0-9_]`。
- `\W`:匹配任何非字母数字字符,等价于 `[^a-zA-Z0-9_]`。
- `\s`:匹配任何空白字符,包括空格、制表符、换行符等。
- `\S`:匹配任何非空白字符。

需要注意的是,由于反斜杠在普通字符串中也具有转义作用,因此表示单个反斜杠字符本身,需要写成 `\\`。例如,`\\d` 表示匹配任意数字字符。

除了以上元字符外,`\` 还可以将某些特殊字符转义成普通字符,例如 `.`,代表匹配任何字符,而 `\.` 则只匹配小数点。这种转义称为字符转义(Character Escapes)。

思考:python中元字符'\'和转义字符'\'的区别?

(5)元字符 `[]`

中括号 `[]` 是正则表达式中常用的元字符之一,用于匹配某个字符集合中的任意一个字符。

例如,正则表达式 `[abc]` 匹配三个字母 `a`、`b` 和 `c` 中的任何一个。以下是中括号的几种使用方法:

1. `[abc]`:匹配字符 `a`、`b` 或 `c` 中的任何一个。

2. `[a-d]`:匹配字符集合 `{a, b, c, d}` 中的任何一个字符。

3. `[^abc]`:匹配不是abc中任意一个字符的字符。方括号内的插入符 `^`,表示取反操作。

4. `[a-zA-Z]`:匹配所有的大小写英文字母。

5. `[0-9]`:匹配所有的数字字符。

6. `[^\u4E00-\u9FA5]`:匹配非汉字字符,其中 `\u4E00` 和 `\u9FA5` 是 Unicode 编码值。

需要注意的是,中括号内的元字符和符号在大部分情况下不再具有特殊含义(例如 `.` 或 `*`),只是普通的字符。同时也可以将多个字符合并在一起表示为一个字符集合(例如 `[abcde]` 可以简写为 `[a-e]`)。

当需要匹配一个具体的字符时,可以直接引用该字符(例如 `[.]` 匹配的是一个字符点而不是任意字符)。

4、常见的正则表达式

1. 匹配数字:\d
2. 匹配字母:[a-zA-Z]
3. 匹配邮箱:\w+@\w+\.\w+
4. 匹配手机号码:1[3456789]\d{9}
5. 匹配IP地址:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
6. 匹配URL地址:(https?|ftp)://[\w\-]+(\.[\w\-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?
7. 匹配中文字符:[\u4e00-\u9fa5]
8. 匹配日期格式:\d{4}-\d{1,2}-\d{1,2}
9. 匹配时间格式:\d{1,2}:\d{1,2}(:\d{1,2})?
10. 匹配空白行:\n\s*\r
11. 匹配HTML标记:<(\S*?)[^>]*>.*?</\1>|<.*? />
12. 匹配QQ号码:[1-9][0-9]{4,}
13. 匹配微信号:[a-zA-Z][-_a-zA-Z0-9]{5,19}
14. 匹配车牌号码:([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼])([A-HJ-NP-Z])(([0-9]{5}[DF])|([DF][A-HJ-NP-Z0-9][0-9]{4}))

正则表达式在线测试 | 菜鸟工具

5、正则表达式在线工具

在实际应用中也可以使用现成的正则表达式库和函数,无需手动编写太复杂的正则表达式。但即便如此,理解正则表达式的基本原理和语法规则,对于进行文本处理工作仍旧是很有帮助的。

正则表达式在线测试 | 菜鸟工具

6、正则表达式原理和优化(高级)

正则表达式特点 :难记忆、难描述、广而深且不受重视。

知其然,知其所以然。有兴趣的同学可以看看这边文章:

正则表达式引擎执行原理——从未如此清晰!_慕课手记

匹配原理(预编译)

正则引擎(DFA,NFA)

引擎回溯(性能调优)

7、在Python中使用正则表达式

在 Python 中使用正则表达式需要用到 re 模块。可以使用该模块提供的函数对字符串进行查找、替换、分割等操作。

详见:re --- 正则表达式操作 — Python 3.8.16 文档

下面是使用 re 模块的基本流程:

1. 导入 re 模块:`import re`

2. 编写正则表达式。

3. 使用 re 模块提供的函数进行匹配或替换等操作。

常用的 re 模块函数及其作用如下:

  • - `re.match(pattern, string)`: 在字符串开头匹配正则表达式,若匹配成功返回 match 对象,否则返回 None;
  • - `re.search(pattern, string)`: 在字符串中查找第一个匹配正则表达式的子串,若匹配成功返回 match 对象,否则返回 None;
  • - `re.findall(pattern, string)`: 返回字符串中所有匹配正则表达式的子串列表;
  • - `re.sub(pattern, repl, string)`: 把字符串中匹配正则表达式的子串替换成 repl 字符串。

以下是一个例子,展示如何使用 re 模块验证手机号码:

import re

pattern = r"^1\d{10}$"
phone_numbers = ["13012345678", "13688889999", "x1234567890"]
for number in phone_numbers:
    if re.match(pattern, number):
        print(number, "is a valid phone number.")
    else:
        print(number, "is an invalid phone number.")

以上代码中,首先定义了一个正则表达式,然后对一个包含合法和非法号码的列表进行遍历,使用 re.match() 函数进行匹配并输出结果。

需要注意的是,在正则表达式中使用反斜杠 (\) 转义特殊字符时需要使用原始字符串表示法 (raw string notation),即在字符串前加 r。例如上面定义正则表达式的语句就使用了原始字符串表示法。


reference:

正则表达式 – 教程 | 菜鸟教程

正则表达式HOWTO — Python 3.8.16 文档

re --- 正则表达式操作 — Python 3.8.16 文档

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值