正则表达式(Regular Expression,简称 Regex)是一种用来匹配字符串的特殊语法。在 Python 中,可以通过内置的 re
模块来使用正则表达式。
re
模块提供了很多函数来处理正则表达式,下面是一些常用的函数:
re.compile(pattern, flags=0)
:编译正则表达式,返回一个 Pattern
对象。re.search(pattern, string, flags=0)
:在字符串中搜索匹配正则表达式的第一个位置,返回一个 Match
对象。如果没有匹配,返回 None
。re.match(pattern, string, flags=0)
:尝试从字符串的起始位置匹配正则表达式,返回一个 Match
对象。如果没有匹配,返回 None
。re.findall(pattern, string, flags=0)
:搜索字符串,以列表形式返回全部能匹配的子串。re.finditer(pattern, string, flags=0)
:搜索字符串,返回一个迭代器,包含匹配正则表达式的所有子串。re.sub(pattern, repl, string, count=0, flags=0)
:使用指定的字符串替换原字符串中与正则表达式匹配的子串。可以指定替换的次数。返回替换后的字符串。在这些函数中,最重要的是 re.compile()
和 re.search()
,因为它们提供了最基本的正则表达式匹配功能。
正则表达式是由一些特殊字符和普通字符组成的。其中特殊字符有特殊的含义,用来匹配字符串中的一些特定模式。下面是一些常用的特殊字符:
符号 | 描述 |
---|---|
. | 匹配任意一个字符,不包括换行符 |
[] | 匹配方括号中的任意一个字符 |
[^] | 匹配不在方括号中的任意一个字符 |
\d | 匹配任意一个数字,等价于 [0-9] |
\D | 匹配任意一个非数字字符,等价于 [^0-9] |
\w | 匹配任意一个数字或字母,等价于 [0-9a-zA-Z] |
\W | 匹配任意一个非数字或非字母字符,等价于 [^0-9a-zA-Z] |
\s | 匹配任意一个空白字符,等价于 [\t\n\r\f\v] |
\S | 匹配任意一个非空白字符,等价于 [^\t\n\r\f\v] |
\b | 匹配单词的边界 |
\B | 匹配非单词的边界 |
下面是一些例子:
import re
# 匹配数字和字母
pattern = re.compile(r'\w')
print(pattern.findall('abc123')) # ['a', 'b', 'c', '1', '2', '3']
# 匹配空白字符
pattern = re.compile(r'\s')
print(pattern.findall('Hello\nWorld\t!')) # ['\n', '\t']
# 匹配边界
pattern = re.compile(r'\bhello\b')
print(pattern.findall('hello, world!')) # ['hello']
print(pattern.findall('say hello!')) # ['hello']
print(pattern.findall('sayhello!')) # []
符号 | 描述 |
---|---|
* | 匹配前一个字符 0 次或多次 |
+ | 匹配前一个字符 1 次或多次 |
? | 匹配前一个字符 0 次或 1 次 |
{m} | 匹配前一个字符 m 次 |
{m,} | 匹配前一个字符至少 m 次 |
{m,n} | 匹配前一个字符至少 m 次,但不超过 n 次 |
下面是一些例子:
import re
# 匹配至少一个数字
pattern = r"\d+"
text = "Hello 1234 World 5678"
match = re.search(pattern, text)
print(match.group()) # 1234
# 匹配0到多个数字
pattern = r"\d*"
text = "Hello 1234 World 5678"
match = re.search(pattern, text)
print(match.group()) # 空字符串
# 匹配0到1个数字
pattern = r"\d?"
text = "Hello 1234 World 5678"
match = re.search(pattern, text)
print(match.group()) # 空字符串
# 匹配3个到5个数字
pattern = r"\d{3,5}"
text = "Hello 1234567 World 8910"
match = re.search(pattern, text)
print(match.group()) # 12345
在这个例子中,我们使用了以下语法:
+
表示匹配至少一个,即前面的元素可以出现一次或多次。*
表示匹配0到多个,即前面的元素可以不出现,或者出现多次。?
表示匹配0到1个,即前面的元素可以不出现,或者出现一次。{m,n}
表示匹配m到n次,即前面的元素可以出现m次、n次或m到n次。注意,这些语法都是贪婪匹配,即会尽可能多地匹配,例如在 {3,5}
中,如果文本中有7个数字,那么会匹配前5个数字,而不是只匹配前3个数字。如果需要非贪婪匹配,可以在语法后面加上 ?
,例如 {3,5}?
表示非贪婪匹配。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。