正则表达式
正则表达式是一种表达字符串匹配模式的强大工具。其可以精确地匹配文本中的特定字符和字符串,可以帮助我们有效地进行数据清洗、文本修改、信息提取等操作。在数据分析、爬虫、文本处理等领域都有广泛应用。
正则表达式的基础语法
正则表达式的语法非常灵活,基本上可以匹配任何需要的模式。
下面是一些基本的正则表达式语法:
范围匹配
匹配模式 | 匹配规则 |
---|---|
[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
模块提供了一些常用的函数,可以用于搜索、替换、分割字符串中的文本。
在使用正则表达式时,我们需要深入了解其语法和匹配规则,特别是贪婪和非贪婪匹配的区别。只有掌握了这些知识,我们才能更好地利用正则表达式来解决实际问题。
最后,建议大家可以多尝试写一些正则表达式的代码,并进行调试和优化,这样才能更好地掌握其应用技巧,并将其应用到实际问题中。