正则表达式

正则表达式

正则表达式是一种表达字符串匹配模式的强大工具。其可以精确地匹配文本中的特定字符和字符串,可以帮助我们有效地进行数据清洗、文本修改、信息提取等操作。在数据分析、爬虫、文本处理等领域都有广泛应用。

正则表达式的基础语法

正则表达式的语法非常灵活,基本上可以匹配任何需要的模式。

下面是一些基本的正则表达式语法:

范围匹配

匹配模式 匹配规则
[abc] 匹配 a, b 或 c 中任意一个字符
[a-z] 匹配 a 到 z 中任意一个字符
[^0-9] 匹配除了数字以外的所有字符

示例代码:

import re

s = 'hello, world'
result = re.findall('[a-z]', s)
print(result)  # ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']

量词匹配

匹配模式 匹配规则
a* 匹配 0 个或多个 a
a+ 匹配 1 个或多个 a
a? 匹配 0 个或 1 个 a
a{n} 匹配 n 个 a
a{n,} 匹配至少 n 个 a
a{n,m} 匹配至少 n 个,最多 m 个 a

示例代码:

import re

s = 'aaaabbbbccccdddd'
result = re.findall('a*', s)
print(result)  # ['aaaa', '', '', '', '']
import re

s = 'aaaabbbbccccdddd'
result = re.findall('a+', s)
print(result)  # ['aaaa']
import re

s = 'aaaabbbbccccdddd'
result = re.findall('a?', s)
print(result)  # ['a', 'a', 'a', 'a', '', '', '', '']
import re

s = 'aaaabbbbccccdddd'
result = re.findall('a{3}', s)
print(result)  # ['aaa']

边界匹配

匹配模式 匹配规则
^abc 匹配以 abc 开头的字符串
abc$ 匹配以 abc 结尾的字符串
\babc\b 匹配整个单词 abc

示例代码:

import re

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

s = 'hello, world'
result = re.findall('world$', s)
print(result)  # ['world']
import re

s = 'hello, world'
result = re.findall(r'\bhello\b', s)
print(result)  # ['hello']

逻辑匹配

匹配模式 匹配规则
abc|def 匹配 abc 或 def
(abc) 捕获匹配 abc 的字符串
(?:abc) 不捕获匹配 abc 的字符串

示例代码:

import re

s = 'hello, world'
result = re.findall('hello|world', s)
print(result)  # ['hello', 'world']
import re

s = 'hello, world'
result = re.findall('(hello), (world)', s)
print(result)  # [('hello', 'world')]
import re

s = 'hello, world'
result = re.findall('(?:hello), (world)', s)
print(result)  # ['world']

re模块的常用函数

Python 的标准库中包含了 re 模块,专门用于处理正则表达式的匹配问题,下面是re模块中常用的几个函数:

re.search

re.search 函数用于在字符串中搜索正则表达式的第一次出现,并返回一个匹配对象。如果找到了匹配,则返回匹配对象,否则返回 None

示例代码:

import re

s = 'hello, world'
result = re.search('world', s)
print(result)  # <re.Match object; span=(7, 12), match='world'>

re.match

re.match 函数用于在字符串的开头匹配正则表达式,并返回一个匹配对象。如果找到了匹配,则返回匹配对象,否则返回 None

示例代码:

import re

s = 'hello, world'
result = re.match('hello', s)
print(result)  # <re.Match object; span=(0, 5), match='hello'>

re.findall

re.findall 函数用于在字符串中搜索正则表达式的所有出现,并返回一个列表。如果没有找到匹配,则返回一个空列表。

示例代码:

import re

s = 'hello, world'
result = re.findall('[a-z]', s)
print(result)  # ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']

re.sub

re.sub 函数用于在字符串中搜索正则表达式的所有出现,并将它们替换为指定的字符串。该函数返回替换后的新字符串。

示例代码:

import re

s = 'hello, world'
result = re.sub('world', 'python', s)
print(result)  # 'hello, python'

贪婪与非贪婪匹配

回顾一下前面提到的量词匹配,有些量词匹配是贪婪的,有些是非贪婪的。

所谓贪婪和非贪婪,是指正则表达式中的量词匹配会优先匹配尽可能多的字符,或者尽可能少的字符。

例如,假设我们有一个字符串 abbbbbb,正则表达式为 a.*b,表示匹配以 a 开头,以 b 结尾,中间可以有任意多个字符。

这里的 * 表示匹配任意多个字符,因此,这个正则表达式可以匹配 abbbbbb,但是如果我们希望只匹配到第一个 b 后面的字符,应该怎样做呢?

这时就需要区分贪婪匹配和非贪婪匹配了。贪婪匹配会尽可能多地匹配字符,因此,正则表达式会匹配到字符串的最后一个 b。而非贪婪匹配则会尽可能少地匹配字符,所以正则表达式应该写成 a.*?b

示例代码:

import re

s = 'abbbbbb'
result1 = re.findall('a.*b', s)
result2 = re.findall('a.*?b', s)
print(result1)  # ['abbbbbb']
print(result2)  # ['ab']

结论

正则表达式是一种强大的匹配模式,可以帮助我们快速地进行数据清洗和信息提取。re 模块提供了一些常用的函数,可以用于搜索、替换、分割字符串中的文本。

在使用正则表达式时,我们需要深入了解其语法和匹配规则,特别是贪婪和非贪婪匹配的区别。只有掌握了这些知识,我们才能更好地利用正则表达式来解决实际问题。

最后,建议大家可以多尝试写一些正则表达式的代码,并进行调试和优化,这样才能更好地掌握其应用技巧,并将其应用到实际问题中。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程