正则表达式是一种文本模式,用于匹配字符串,它是由字符和特殊字符组成的模式。正则表达式可以用于验证、搜索、替换和提取字符串。其能够应用于各种编程语言和文本处理工具中,如Python、Java、JavaScript等。
正则表达式在线测试工具:https://c.runoob.com/front-end/854/
普通字符
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。通常情况下普通字符是直接匹配与其相同的字符。如下图:
此处就是从待匹配文本中查找abc
这个字符串,注意必须是与abc
完全匹配才会出现结果。
非打印字符
非打印字符是指在文本中无法直接显示的特殊字符,也称为控制字符或不可见字符。这些字符通常不会在屏幕上显示出来,但它们在计算机系统中起到了各种重要的作用。
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
如下图匹配换行符\n
特殊字符(元字符)
特殊字符就是有一些特殊含义的字符,例如*、\、+等
在这些特殊字符中,如果待匹配文本中出现了与其相同的字符需要匹配的话就需要使这些特殊字符转义,否则它们只会表达自己特殊的含义。正则中的特殊字符有如下表所示。
描述 | 特殊字符 |
---|---|
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
. | 匹配除换行符外的任意单个字符。 |
* | 匹配前面的元素零次或多次。 |
+ | 匹配前面的元素一次或多次。 |
? | 匹配前面的元素零次或一次。 |
| | 用于分隔多个模式,匹配其中之一。 |
[] | 定义字符类,匹配其中包含的任意一个字符。 |
[^] | 定义反向字符类,匹配不在其中的任意一个字符。 |
() | 用于分组和捕获匹配的内容。 |
\ | 用于转义特殊字符,使其成为普通字符。 |
{n} | 匹配前面的元素恰好 n 次。 |
{n,} | 匹配前面的元素至少 n 次。 |
{n,m} | 匹配前面的元素至少 n 次,但不超过 m 次。 |
以下是一些示例,展示了正则表达式中特殊字符的用法和功能(过多规则就不再贴图展示了,大家自行在测试工具测试):
使用^和$匹配完整的字符串(表示能够匹配到的字符串必须以abc开头结尾):
- 正则表达式:^abc$
- 匹配的字符串:abc
- 不匹配的字符串:abcd、aabc
使用.匹配除换行符外的任意单个字符:
- 正则表达式:a.b
- 匹配的字符串:abb、a_b、axb
- 不匹配的字符串:ab、acdb
使用*匹配前面的元素零次或多次:
- 正则表达式:a*b
- 匹配的字符串:b、ab、aab、aaab
- 不匹配的字符串:acdb
使用+匹配前面的元素一次或多次:
- 正则表达式:a+b
- 匹配的字符串:ab、aab、aaab
- 不匹配的字符串:b、acdb
使用?匹配前面的元素零次或一次:
- 正则表达式:a?b
- 匹配的字符串:b、ab
- 不匹配的字符串:aab、aaab
使用|分隔多个模式,匹配其中之一:
- 正则表达式:cat|dog
- 匹配的字符串:cat、dog
- 不匹配的字符串:bat、dot
使用[]定义字符类,在其中匹配任意一个字符:
- 正则表达式:[aeiou]
- 匹配的字符串:a、e、i、o、u
- 不匹配的字符串:b、c、d、f
使用[^]定义反向字符类,在其中匹配不在其中的任意一个字符:
- 正则表达式:[^aeiou]
- 匹配的字符串:b、c、d、f
- 不匹配的字符串:a、e、i、o、u
使用()进行分组和捕获匹配的内容:
- 正则表达式:(abc)+
- 匹配的字符串:abc、abcabc、abcabcabc
- 不匹配的字符串:ab、abcc
使用\进行特殊字符的转义:
- 正则表达式:a\.b
- 匹配的字符串:a.b
- 不匹配的字符串:ab、acb
使用{n}、{n,}和{n,m}指定匹配次数的范围:
- 正则表达式:a{3}
- 匹配的字符串:aaa
- 不匹配的字符串:aa、aaaa
这些示例展示了正则表达式中特殊字符的一些常见用法和功能,但实际上正则表达式在不同的情境下还有更多的用法和功能。具体的正则表达式语法和用法会因不同的编程语言和正则表达式引擎而有所差异,所以在实际应用中,需要对具体的环境和工具进行了解和调整。
定位符
正则表达式的定位符(Anchors)用于匹配字符串的位置,而不是匹配具体的字符。常见的定位符有以下几种:
^:表示匹配字符串的开始位置。例如,正则表达式"^abc"可以匹配以"abc"开头的字符串。
$:表示匹配字符串的结束位置。例如,正则表达式"abc$"可以匹配以"abc"结尾的字符串。
\b:表示匹配一个单词边界,即单词的开始或结束位置。一个单词由字母、数字、下划线组成。例如,正则表达式"\bcat\b"可以匹配单独的单词"cat"。
\B:表示匹配一个非单词边界,即不是单词的开始或结束位置。例如,正则表达式"\Bcat\B"可以匹配"cat"不在单词边界处的情况。
注意:不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。
若要匹配一行文本开始处的文本,请在正则表达式的开始使用 ^ 字符。不要将 ^ 的这种用法与中括号表达式内的用法混淆。
若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用 $ 字符。
修饰符
修饰符(Modifiers)用于修饰正则表达式的匹配规则,改变匹配的行为。不同的编程语言和正则表达式引擎支持不同的修饰符,下面是一些常见的修饰符:
i:忽略大小写。使得正则表达式不区分大小写。例如,正则表达式"abc"匹配"abc"、"AbC"、"aBC"等。
g:全局匹配。使得正则表达式匹配字符串的所有可能。例如,正则表达式"cat"在字符串"cat catcher"中使用全局修饰符可以匹配到两个"cat"。
m:多行匹配。使得正则表达式的"^"和"$"修饰符可以分别匹配一行的开头和结尾。例如,正则表达式"^cat$"将匹配"cat"单独一行的情况。
s:单行匹配。使得正则表达式的"."可以匹配任意字符,包括换行符。默认情况下,"."匹配除换行符以外的任意字符。
x:忽略空白符。使得正则表达式中的空格、制表符等空白符会被忽略,以便更清晰地书写复杂的正则表达式。
需要注意的是,修饰符通常通过特定的语法或方法来应用于正则表达式。具体使用时,需要查阅对应语言或工具的文档以了解正确的修饰符使用方式。
请看一些基本示例
以下是一些示例,演示如何使用修饰符来修改正则表达式的匹配行为:
1. 使用修饰符 i 忽略大小写匹配:
正则表达式:/cat/i
匹配字符串:"cat", "Cat", "CAT" 等。
2. 使用修饰符 g 进行全局匹配:
正则表达式:/cat/g
匹配字符串:"cat cat cat",会找到所有的 "cat"。
3. 使用修饰符 m 进行多行匹配:
正则表达式:/^cat$/m
匹配字符串:
```
cat
cat
cat
```
会匹配每一行的 "cat"。
4. 使用修饰符 s 进行单行匹配:
正则表达式:/a.b/s
匹配字符串:"a\nb",会将 "\n" 当作一个普通字符,而不是换行符。
5. 使用修饰符 x 忽略空白符:
正则表达式:/a b c/x
匹配字符串:"abc",会忽略空格,等效于正则表达式 /abc/。
这只是一些基本示例,实际应用中可以根据具体需求选择适当的修饰符。需要注意的是,不同的语言和工具可能对修饰符的语法有所差异,请查阅相应的文档以获得准确的使用方式。
优先级关系
正则表达式中的元字符和操作符具有特定的优先级关系,用于确定匹配规则的组合顺序。以下是常见的优先级从高到低的顺序:
1. 转义符号:\(反斜杠)用于转义具有特殊意义的字符,例如\.表示匹配实际的"."字符。
2. 括号:()(圆括号)用于创建子表达式,并确定它们的作用范围。
3. 量词:*、+、?、{n}、{n,}、{n,m}等用于指定重复次数。
4. 字符类:[](方括号)用于指定可供选择的字符范围,例如[a-z]表示匹配小写字母。
5. 位置匹配符号:^(脱字符)和$(美元符号)用于匹配字符串的开头和结尾。
6. 选择符号:|(管道符号)用于表示或的关系,匹配其中一个表达式。
优先级关系决定了正则表达式的组合顺序,从而影响了匹配的结果。当多个元字符或操作符同时出现时,按照优先级进行解析和匹配。需要注意的是,可以使用括号来改变优先级关系,明确指定子表达式的作用范围。在编写复杂的正则表达式时,合理利用优先级关系可以确保匹配规则的准确性和可读性。
re模块的使用
在Python中,re模块是用来进行正则表达式操作的标准库。以下是re模块的一些常见用法:
1. 正则表达式匹配:
- re.match(pattern, string):从字符串的起始位置开始匹配,返回一个match对象或None。
- re.search(pattern, string):在字符串中搜索第一个匹配项,返回一个match对象或None。
- re.findall(pattern, string):找到字符串中所有匹配的子串,并以列表形式返回。
- re.finditer(pattern, string):找到字符串中所有匹配的子串,并以迭代器形式返回。
2. 匹配对象(match对象)的方法和属性:
- group():返回匹配到的字符串。
- start():返回匹配字符串的起始位置。
- end():返回匹配字符串的结束位置。
- span():返回匹配字符串的起始和结束位置。
3. 正则表达式的修饰符(可用re.compile()或在pattern中指定):
- re.I或re.IGNORECASE:忽略大小写匹配。
- re.M或re.MULTILINE:多行匹配。
- re.S或re.DOTALL:包括换行符在内的所有字符匹配。
4. 字符串操作:
- re.split(pattern, string):根据正则表达式的匹配项来分割字符串,返回以列表形式存储的分割结果。
- re.sub(pattern, repl, string):用repl替换字符串中匹配到的子串,返回替换后的字符串。
- re.subn(pattern, repl, string):与re.sub()方法类似,但同时返回替换次数。
这只是re模块的一些常见用法,还有更多高级功能可以通过阅读官方文档来学习和掌握。在使用re模块时,需要熟悉正则表达式的语法和规则,以及合理应用各种方法和修饰符来实现特定的匹配需求。
接下来我们通过一个小案例来了解一下re
模块中match
、search
和findall
三种匹配方法的使用。
import re
text = "Hello, I am a Python developer. Nice to meet you!"
# 使用match方法
pattern = r"Hello"
match_result = re.match(pattern, text)
if match_result:
print("Match found with match method!")
else:
print("No match found with match method.")
# 使用search方法
pattern = r"Python"
search_result = re.search(pattern, text)
if search_result:
print("Match found with search method!")
else:
print("No match found with search method.")
# 使用findall方法
pattern = r"\b\w+\b"
findall_result = re.findall(pattern, text)
if findall_result:
print("Matches found with findall method:", findall_result)
else:
print("No matches found with findall method.")
执行结果:
在这个案例中,我们首先定义了一个待匹配的字符串text,并定义了三个不同的正则表达式模式。然后,我们分别使用match、search和findall方法来查找模式在字符串中的匹配项。
- match方法:它从字符串的开头开始匹配,如果能够找到匹配项,则返回一个match对象。在本例中,match方法可以找到“Hello”这个单词,因为它是字符串的开头。所以match方法返回的结果不是None,从而输出了"Match found with match method!"。
- search方法:它在字符串中进行搜索,如果找到了第一个匹配项,则返回一个match对象。在本例中,search方法可以找到“Python”这个单词,所以search方法返回的结果不是None,从而输出了"Match found with search method!"。
- findall方法:它在字符串中查找所有匹配项,并以列表的形式返回。在本例中,我们的模式是匹配英文单词,所以findall方法能够找到字符串中所有的单词,并返回一个包含这些单词的列表。输出了"Matches found with findall method"和所有的匹配项。