1. 正则表达式分组简介
正则表达式是一种用来匹配和处理文本的强大工具。在处理文本时,有时候需要将待匹配的文本按照一定规则分成多个组,这样可以更方便地处理匹配结果。正则表达式分组就是实现这一功能的方法。
2. 捕获型分组
在正则表达式中,使用圆括号将要分组的部分括起来。括起来的部分就是一个分组。常用的分组符号有()
、(?:)
等。
2.1 普通分组
普通分组是最常用的分组形式,它会将分组的匹配结果保存起来。例如,我们想将一个单词的开头字母和后面的字母分别提取出来:
import re
text = "Hello, World!"
pattern = "(\w)(\w+)"
match = re.search(pattern, text)
if match:
group1 = match.group(1)
group2 = match.group(2)
print(f"Group 1: {group1}")
print(f"Group 2: {group2}")
运行结果:
Group 1: H
Group 2: ello
可以看到,分组的匹配结果可以通过match.group()
方法获得。
2.2 非捕获型分组
有时候我们只想分组匹配,但不需要保存匹配结果。这时可以使用非捕获型分组来实现。
import re
text = "123-456-7890"
pattern = "(?:\d{3})-(\d{3})-(\d{4})"
match = re.search(pattern, text)
if match:
group1 = match.group(1)
print(f"Group 1: {group1}")
运行结果:
Group 1: 456
可以看到,非捕获型分组的匹配结果不会保存。
3. 非捕获型分组的妙用
3.1 反向引用
非捕获型分组可以实现反向引用的功能。例如,我们想查找重复的单词:
import re
text = "I love love Python Python Python!"
pattern = r"\b(\w+)\b(?:\s+\1\b)+"
matches = re.findall(pattern, text)
print(matches)
运行结果:
['love', 'Python']
可以看到,通过使用非捕获型分组和反向引用,我们找到了重复的单词。
3.2 分组结构嵌套
非捕获型分组还可以嵌套使用,从而实现更复杂的匹配逻辑。例如,我们想匹配一对括号内部的内容:
import re
text = "(Hello, World!) (Welcome to Python!)"
pattern = "\(.*?\)|\[(.*?)\]|\{.*?\}"
matches = re.findall(pattern, text)
print(matches)
运行结果:
['Hello, World!', 'Welcome to Python!']
通过嵌套使用非捕获型分组,我们成功匹配了一对括号内部的内容。
4. 本文小结
本文介绍了正则表达式中分组的使用技巧,包括捕获型分组和非捕获型分组。捕获型分组可用于提取匹配结果,而非捕获型分组则可以实现更复杂的匹配逻辑。通过灵活运用分组功能,我们可以更方便地处理文本匹配任务。