Python正则表达式教程之二:捕获篇

  • Post category:Python

Python正则表达式教程之二:捕获篇

在正则表达式中,捕获组是一种将匹配的子字符串提取出来的方法。Python中的re模块提供了多种函数来支持捕获组的使用。本攻略将详细讲解Python中re模块的捕获组相关函数,包括如何使用捕获组、如何命名捕获组、如何非捕获组等内容。

捕获组的基本使用

捕获组是由一对圆括号括起来的正则表达式。当则表达式匹配成功时,捕获组会将匹配的子字符串提取出来。下面是一个例子,演示如何使用捕获组提取出字符串中的数字:

import re

text = 'The answer is 42.'
pattern = r'The answer is (\d+)\.'
result = re.search(pattern, text)
if result:
    print('Match found:', result.group())
    print('Captured group:', result.group(1))
else:
    print('Match not found')

在上面的代码中,我们使用捕获组(\d+)提取出字符串中的数字。\d+表示匹配一个或多个数字。()表示将\d+匹配到数字作为一个捕获组。运行代码后,输出结果为Match found: The answer is 42.Captured group: 42

命名捕获组

除了使用圆括号来创建捕获组外,还可以使用(?P<name>...)语法来创建命名捕获组。命名捕获组可以通过名称来引用,而不是通过索引。下面是一个例子演示如何使用命名捕获组提取出字符串中的数字:

import re

text = 'The answer is 42.'
pattern = r'The answer is (?P<number>\d+)\.'
result = re.search(pattern, text)
if result:
    print('Match found:', result.group())
    print('Captured group:', result.group('number'))
else:
    print('Match not found')

在上面的代码中,我们使用命名捕获组(?P<number>\d+)提取出字符串中的数字。(?P<number>...)表示将\d+匹配到的数字作为一个名为“的捕获组。运行代码后,输出结果与前面的例子相同。

非捕获组

在正则表达式中,有时候我们需要使用圆括号来分组,但是又不需要捕获组的功能。这时候可以使用非捕获组(?:...)来实现。下面是一个例子,演示如何使用非捕获组:

import re

text = 'The brown fox jumps over the lazy dog.'
pattern = r'(?:quick|fast) (\w+)'
result = re.search(pattern, text)
if result:
    print('Match found:', result.group())
    print('Captured group:', result.group(1))
else:
    print('Match not found')

在上面的代码中,我们使用非捕获组(?:quick|fast)来匹配quickfast,但不需要捕获组的功能。\w+表示匹配一个或多个字母、数字、下划线。运行代码后,输出结果为Match found: quick brownCaptured group: brown

示例说明

示例1:提取HTML标签中的属性值

下面是一个例子,演示如何使用正则表达式提取HTML标签中的属性值:

import re

text = '<a href="https://www.example.com">Example</a>'
pattern = r'<a href="([^"]+)">([^<]+)</a>'
result = re.search(pattern, text)
if result:
    print('Match found:', result.group())
    print('URL:', result.group(1))
    print('Text:', result.group(2))
else:
    print('Match not found')

在上面的代码中,我们使用正则表达式<a href="([^"]+)">([^<]+)</a>提取HTML标签中的href属性值和文本内容。[^+表示匹配一个或多个非双引号字符,[^<]+表示匹配一个或多个非小于号字符。运行代码后输出结果为Match found: <a href="https://www.example.com">Example</a>URL: https://www.example.comText: Example

示例2:提取JSON字符串中的键值对

下面是另一个例子,演示如何使用正则表达式取JSON字符串中的键值对:

import re

text = '{"name": "John", "age": 30, "city": "New York"}'
pattern = r'"(\w+)":\s*"([^"]+)"'
result = re.findall(pattern, text)
if result:
    print('Matches found:', result)
    for key, value in result:
        print(key, ':', value)
else:
    print('Matches not found')

在上面的代码中,我们使用正则表达式"(\w+)":\s*"([^"]+)"提取JSON字符串中的键值对。\w+表示匹配一个或多个字母、数字、下划线,[^”]+表示匹配一个或多个非双引号字符。()表示将\w+[^”]+匹配到的字符串作捕获组。\s*表示匹配零个或多个空格字符。findall()函数可以返回所有匹配的结果。运行代码后,输出结果为Matches found: [(‘name’, ‘John’), (‘age’, ’30’), (‘city’, ‘New York’)]`和每个键值对的具体内容。

总结

本攻略详细讲解了Python中re模块的捕获组相关函数,包括如何使用捕获组、如何命名捕获组、如何使用非捕获组等内容。捕获组是一种将匹配的子字符串提取出来的方法,可以大大提高正则表达式的灵活性和实用性。演示了如何使用捕获组提取HTML标签中的属性值和JSON字符串中的键值对。希望读者可以通过这些示例更好地理解捕获组的使用方法。