正则表达式(Regular Expression,简称regex或regexp)是一种强大的文本处理工具,它使用一种特殊的语法来描述字符模式,这些模式可以用来在文本中搜索、匹配或替换字符串。正则表达式在文本编辑、搜索引擎、编程语言等领域都有广泛的应用。
基本概念
- 元字符:正则表达式中具有特殊含义的字符,如`.`、`*`、`+`、`?`、`^`、`$`、`|`等
- 字符类:用来匹配一类字符的表达式,如`[a-z]`表示匹配任意小写字母。正则表达式使用特定的元字符和字符类来定义模式。例如:- `.`:匹配任意单个字符(除了换行符)。
- `*`:匹配前面的子表达式零次或多次。
- `+`:匹配前面的子表达式一次或多次。
- `?`:匹配前面的子表达式零次或一次。
- `^`:匹配输入字符串的开始位置。
- `$`:匹配输入字符串的结束位置。
- `\d`:匹配一个数字字符,等价于 `[0-9]`。
- `\w`:匹配一个单词字符(字母、数字或下划线),等价于 `[a-zA-Z0-9_]`
- `|` 用于选择,匹配 `|` 前后的任一模式。
\b 是一个特殊的元字符,它表示一个单词边界。单词边界是指一个单词字符(如字母、数字或下划线)和非单词字符(如空格、标点符号或字符串的开始/结束位置)之间的位置。
3. 量词:用来指定前面的字符或字符类出现的次数,如`*`表示前面的元素可以出现零次或多次。
4. 分组与捕获:使用圆括号`()`来创建分组,并捕获匹配的内容。使用括号 `()` 可以对正则表达式进行分组,并可以通过 `\1`、`\2` 等引用前面的分组。例如:
```python
# 匹配重复的单词
pattern = re.compile(r'(\b\w+)\s+\1')
match = pattern.search('hello hello world')
if match:
print('Found', match.group()) # 输出:Found hello hello
```
5. 转义字符:使用`\`来转义元字符,使其失去特殊含义,或者引入具有特殊含义的字符。
常见用法
1. 匹配字符串:使用正则表达式来检查一个字符串是否符合特定的模式。
python
import re
pattern = re.compile(r'\d+') # 匹配一个或多个数字
match = pattern.match('123abc') # 尝试从字符串的起始位置匹配模式
if match:
print("Match found:", match.group())
```
2. 查找所有匹配项:使用`findall`方法查找字符串中所有符合模式的子串。
python
pattern = re.compile(r'\b\w+\b') # 匹配单词边界内的单词
matches = pattern.findall('Hello, world! This is a test.')
print(matches) # 输出:['Hello', 'world', 'This', 'is', 'a', 'test']
3. 替换字符串:使用`sub`方法将字符串中符合模式的部分替换为其他内容。
python
pattern = re.compile(r'\d+') # 匹配数字
new_string = pattern.sub('NUMBER', 'There are 123 apples and 456 oranges.')
print(new_string) # 输出:There are NUMBER apples and NUMBER oranges.
4. 分割字符串:使用`split`方法根据正则表达式来分割字符串。
python
pattern = re.compile(r'\s+') # 匹配一个或多个空白字符
parts = pattern.split('This is a test.')
print(parts) # 输出:['This', 'is', 'a', 'test.']
5. 边界匹配和选择
- `^` 和 `$` 分别用于匹配字符串的开始和结束位置。
- `|` 用于选择,匹配 `|` 前后的任一模式。
python
# 匹配整行以 "Hello" 或 "World" 开头的文本
pattern = re.compile(r'^(Hello|World)')
match = pattern.search('Hello, world!\nWorld, hello!')
if match:
print('Found', match.group()) # 输出:Found Hello
6.正则表达式还可以使用修饰符来改变匹配的行为,例如 `re.IGNORECASE` 使匹配对大小写不敏感。
python
pattern = re.compile(r'hello', re.IGNORECASE)
match = pattern.search('Hello, world!')
if match:
print('Found', match.group()) # 输出:Found Hello
7.贪婪与非贪婪匹配
正则表达式默认是贪婪匹配,即尽可能多地匹配字符。使用 `?` 可以将贪婪匹配转为非贪婪(懒惰)匹配。
python
贪婪匹配
pattern = re.compile(r'<.*>')
match = pattern.search('<html><body>Text</body></html>')
print(match.group()) # 输出:<html><body>Text</body></html>
非贪婪匹配
pattern = re.compile(r'<.*?>')
match = pattern.search('<html><body>Text</body></html>')
print(match.group()) # 输出:<html>
补充:子表达式(也叫组件)是一个大的表达式的一部分,通常被圆括号()包围,用于将其中的内容视为一个整体进行处理。子表达式的目的是为了把那些子表达式当作一个独立的元素来使用,以便进行分组、引用和重复等操作。
嵌套其他子表达式,理论上可以无限嵌套。这种嵌套结构允许我们构建复杂的匹配模式,以匹配具有特定结构的字符串。
引用前面已经匹配过的文本。例如,\1 引用的是第1个子表达式,\2 引用的是第2个子表达式,以此类推。这种引用机制使得我们可以在正则表达式中实现复杂的匹配和替换操作。
顺序是根据左括号的顺序来确定的。因此,在编写包含多个子表达式的正则表达式时,需要特别注意括号的配对和顺序。
可以包含普通字符、元字符、字符集合、字符范围等组件,并可以使用限定符和定位符来指定匹配的次数和位置。这使得子表达式具有强大的匹配能力,可以精确地匹配复杂的字符串模式。。