正则表达式(Regular Expression, 简称 regex 或 RE)是一种文本模式匹配工具,通常用于字符串的搜索、替换和分割。
常用匹配规则
元字符
模式 | 描述 |
---|---|
. | 匹配任意单个字符(除换行符)。 |
^ | 匹配字符串的开头。 |
$ | 匹配字符串的结尾。 |
* | 匹配前一个字符0次或多次。 |
+ | 匹配前一个字符1次或多次。 |
? | 匹配前一个字符0次或1次。 |
{n} | 精确匹配前一个字符 n 次。 |
{n,} | 匹配前一个字符至少 n 次。 |
{n,m} | 匹配前一个字符 n 到 m 次。 |
字符类
模式 | 描述 |
---|---|
[abc] | 匹配字符 “a”、“b” 或 “c”。 |
[a-z] | 匹配所有小写字母。 |
[^abc] | 匹配除 “a”、“b” 和 “c” 之外的任意字符。 |
预定义字符类
模式 | 描述 |
---|---|
\d | 匹配任意数字,等价于 [0-9]。 |
\D | 匹配任意非数字。 |
\w | 匹配字母、数字或下划线,等价于 [a-zA-Z0-9_]。 |
\W | 匹配非字母、数字和下划线。 |
\s | 匹配空白字符,包括空格、制表符等。 |
\S | 匹配非空白字符。 |
分组和引用
模式 | 描述 |
---|---|
() | 用于分组,可以将一部分模式看作一个整体 |
| | 匹配左边或右边的表达式。 |
\1, \2,… | 反向引用,用于引用分组匹配的内容。 |
match
match
方法用于在字符串的开头检查是否有符合特定正则表达式模式的内容。如果字符串的开头部分匹配指定的模式,re.match() 会返回一个匹配对象;否则,返回 None。
方法的定义
result = re.match(pattern, string, flags=0)
参数
pattern
:要匹配的正则表达式。string
:要搜索的字符串。flags
(可选):控制匹配方式的标志,例如忽略大小写、启用多行模式等。
返回值
- 成功匹配:返回一个 Match 对象。
- 不匹配:返回 None。
import repattern = r"hello"
string = "hello world"result = re.match(pattern, string)
if result:print("Match found:", result) # Match found: <re.Match object; span=(0, 5), match='hello'>
else:print("No match")
通用匹配
.*
.
可以匹配任意字符,*
可以匹配前面的字符无限次,他们组合在一起就可以匹配任意字符了。
贪婪与非贪婪
- 贪婪匹配
在贪婪匹配下.*
会尽可能多的字符。 - 非贪婪匹配
非贪婪匹配写法是.*?
,匹配尽可能少的字符。
修饰符
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 实现本地化识别匹配 |
re.M | 多行匹配,影响^和$ |
re.S | 使匹配内容包括换行符在内的所有字符 |
re.U | 根据Unicode字符集解析字符 |
re.X | 给予更灵活的格式,使正则表达式易于理解 |
转义匹配
目标字符串包含正则匹配模式的特殊字符时,在此字符前面加反斜线\转义一下即可。
search
seatch方法的定义:result = re.search(pattern, string, flags=0)
match
方法是从目标字符串开头进行匹配的,会有些不便。search
方法在匹配时会扫描整个字符串,然后返回第一个匹配成功的结果,如果扫描完还没有找到符合规则的字符串,就返回None。
findall
findall方法的定义:result=re.findall(pattern, string, flags=0)
findall
用于在字符串中找出正则表达式模式所匹配的所有子串,并返回一个包含所有匹配结果的列表。如果没有找到匹配项,则返回一个空列表。
sub
sub方法的定义:re.sub(pattern, repl, string, count=0, flags=0)
sub
方法用于替换字符串中匹配正则表达式模式的所有子串,并返回一个新的字符串。这个方法不会修改原始字符串,而是返回一个新的字符串,其中所有匹配的子串都被替换了。
compile
compile方法的定义:re.compile(pattern, flags=0)
compile
方法用于编译一个正则表达式模式,返回一个正则表达式对象(也称为模式对象)。这个对象可以用于后续的匹配操作,比如 match()、search()、sub() 等。