山不在高,有仙则名。水不在深,有龙则灵。
----CSDN 时时三省
目录
1,介绍
正则表达式(Regular Expression)是一种强大的文本匹配工具,用于在字符串中搜索、匹配和替换特定的模式。正则表达式由普通字符和特殊字符(元字符)组成,这些元字符赋予正则表达式其强大的功能。
2,常见的正则表达式符号及其意义:
1. 普通字符
- **普通字符**:如字母、数字和标点符号,匹配它们自身。
- 示例:`a` 匹配字符 `a`。
- 示例:`123` 匹配字符串 `123`。
2. 元字符
元字符具有特殊的意义,用于定义复杂的匹配规则。
2.1 锚点
- **`^`**:匹配字符串的开始。
- 示例:`^Hello` 匹配以 `Hello` 开头的字符串。
- **`$`**:匹配字符串的结束。
- 示例:`world$` 匹配以 `world` 结尾的字符串。
2.2 量词
- **`*`**:匹配前面的字符零次或多次。
- 示例:`a*` 匹配 `a` 出现零次或多次,如 `""`、`"a"`、`"aa"`。
- **`+`**:匹配前面的字符一次或多次。
- 示例:`a+` 匹配 `a` 出现一次或多次,如 `"a"`、`"aa"`。
- **`?`**:匹配前面的字符零次或一次。
- 示例:`a?` 匹配 `a` 出现零次或一次,如 `""`、`"a"`。
- **`{n}`**:匹配前面的字符恰好 `n` 次。
- 示例:`a{3}` 匹配 `a` 出现 3 次,如 `"aaa"`。
- **`{n,}`**:匹配前面的字符至少 `n` 次。
- 示例:`a{2,}` 匹配 `a` 出现 2 次或更多,如 `"aa"`、`"aaa"`。
- **`{n,m}`**:匹配前面的字符至少 `n` 次,但不超过 `m` 次。
- 示例:`a{1,3}` 匹配 `a` 出现 1 到 3 次,如 `"a"`、`"aa"`、`"aaa"`。
2.3 字符集
- **`[]`**:匹配括号内的任意一个字符。
- 示例:`[abc]` 匹配 `a`、`b` 或 `c`。
- 示例:`[a-z]` 匹配任意小写字母。
- 示例:`[0-9]` 匹配任意数字。
- **`[^...]`**:匹配不在括号内的任意一个字符。
- 示例:`[^abc]` 匹配除 `a`、`b` 和 `c` 之外的任意字符。
- 示例:`[^a-z]` 匹配任意非小写字母的字符。
2.4 特殊字符
- **`.`**:匹配任何单个字符(除换行符外)。
- 示例:`a.b` 匹配 `a` 和 `b` 之间有任意一个字符,如 `"a1b"`、`"a b"`。
- **`\`**:转义字符,用于匹配元字符或特殊字符。
- 示例:`\.` 匹配字符 `.`。
- 示例:`\d` 匹配任意数字字符。
- 示例:`\w` 匹配任意字母数字字符。
- 示例:`\s` 匹配任意空白字符。
- **`|`**:表示逻辑“或”。
- 示例:`a|b` 匹配 `a` 或 `b`。
- **`()`**:分组,用于捕获匹配的部分。
- 示例:`(ab)+` 匹配一个或多个 `ab`,如 `"ab"`、`"abab"`。
3. 预定义字符集
- **`\d`**:匹配任意数字字符(0-9)。
- **`\D`**:匹配任意非数字字符。
- **`\w`**:匹配任意字母数字字符(a-z, A-Z, 0-9, `_`)。
- **`\W`**:匹配任意非字母数字字符。
- **`\s`**:匹配任意空白字符(空格、制表符、换行符等)。
- **`\S`**:匹配任意非空白字符。
示例代码
import re
text = "Hello, World! 123\nThis is a test."
# 匹配以 'Hello' 开头的字符串
match = re.search(r'^Hello', text, re.MULTILINE)
if match:
print("匹配到:", match.group())
# 匹配以 'test' 结尾的字符串
match = re.search(r'test.$', text, re.MULTILINE)
if match:
print("匹配到:", match.group())
# 匹配任意数字字符
matches = re.findall(r'\d', text)
print("数字字符:", matches)
# 匹配任意空白字符
matches = re.findall(r'\s', text)
print("空白字符:", matches)
# 匹配任意字母数字字符
matches = re.findall(r'\w', text)
print("字母数字字符:", matches)
# 匹配 'Hello' 或 'World'
matches = re.findall(r'Hello|World', text)
print("匹配到的单词:", matches)
# 匹配 'row:' 后面紧跟的单词
text = "row: name fs sf sf"
match = re.search(r'row:\s+(\w+)', text)
if match:
print("匹配到的单词:", match.group(1))
输出
匹配到: Hello
匹配到: test.
数字字符: ['1', '2', '3']
空白字符: [' ', ' ', '\n', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
字母数字字符: ['H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd', '1', '2', '3', 'T', 'h', 'i', 's', 'i', 's', 'a', 't', 'e', 's', 't']
匹配到的单词: ['Hello', 'World']
匹配到的单词: name