Python正则表达式教程之二:捕获篇
在Python正则表达式教程之一中,我们介绍了正则表达式的基本语法和常用函数。在本攻略中,我们将深入探讨则表达式的捕获功能,包括如何使用捕获组、非捕获组、零宽断言等功能。
捕获组
捕获组是正则表达式中的一种特殊语法,用于将匹配到的子字符串作为一个整体进行捕获。在正则表达式中,捕获组使用圆括()
表示。下面是一个例子,演示如使用捕获组提取字符串中的日期:
import re
text = 'Today is 2023-05-14, tomorrow is 2023-05-15.'
pattern = r'(\d{4})-(\d{2})-(\d{2})'
= re.findall(pattern, text)
if result:
print('Matches found:', result)
for match in result:
print('Year:', match[0])
print('Month:', match[1])
print('Day:', match[2])
else:
print('Matches not found')
在上面的代码中,我们使用正则表达式(\d{4})-(\d{2})-(\d{2})
提取中的日期。\d{4}
表示匹配一个四位数字,\d{2}
表示匹配一个两位数字。()
表示将\d{4}
、\d{2}
和\d{2}
匹配到的字符串作为捕获组。findall()
函数可以返回所有匹配的结果。运行代码后,输出结果为Matches found: [('2023', '05', '14'), ('2023', '05', '15')]
和每个日期的具体内容。
非捕获组
非捕获组是正则表达式中的一种特殊语法,用于将匹配到的子字符串作为一个整体进行匹配,但不将其作为捕获组。在正则表达式中,非捕获组使用(?:)
表示。下面是一个例子,演示如何使用非捕获组匹配URL中的协议:
import re
text = 'https://www.example.com'
pattern = r'(?:https?://)([^/]+)'
result = re.search(pattern, text)
if result:
print('Match found:', result.group())
print('Domain:', result.group(1))
else:
print('Match not found')
在上面的代码中,我们使用正则表达式(?:https?://)([^/]+)
匹配URL中的协议。https?://
表示匹配http://
或https://
,[^/]+
表示匹配一个或多个非斜杠字符。(?:)
表示将https?://
作为非捕获组,不将其作为捕获组。运行代码后,输出结果为Match found: https://www.example.com
和Domain: www.example.com
。
零宽断言
零宽断言是正则表达式中的一种特殊语法,用于在匹配字符串时,指定一个位置,该位置必须满足某种条件。在正则表达式中,零宽断言使用(?=)
和(?!)
表示。下面是一个例子,演示如何使用零宽断言匹配字符串中的数字:
import re
text = '123456'
pattern = r'(?<=\d)(?=(\d{3})+$)'
result = re.sub(pattern, ',', text)
print(result)
在上面的代码中,我们使用正则表达式(?<=\d)(?=(\d{3})+$)
匹配字符串中的数字。(?<=\d)
表示匹配前面是一个数字的位置,(?=(\d{3})+$)
表示匹配后面是一个或多个三位数字的位置。(?=)
表示正向零宽断言,(?!)
表示负向零宽断言。sub()
函数用于在字符串中搜索正则表达式的所有匹配项,并将其替换为指定的字符串。运行代码后,输出结果为123,456
。
示例说明
示例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="httpswww.example.com">Example</a>
、URL: https://www.example.com
和Text: 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+和
[^"]+匹配到的字符串作捕获组。
findall()函数可以返回所有匹配的结果。运行代码后,输出结果为
Matches found: [('name', 'John'), ('age', '30'), ('city', 'New York')]`和每个键值对的具体内容。
总结
本攻略详细讲解了Python正则表达式中的捕获组、非捕获组、零宽断言等功能。捕获组可以将匹配到的子字符串作为一个整体捕获,非捕获组可以将匹配到的子字符串作为一个整体进行匹配,但不将其作为捕获组。零宽断言可以在匹配字符串时,指定一个位置,该位置必须满足某种条件。演示了如何使用捕获组提取字符串中的日期、使用非捕获组匹配URL中的协议、使用零宽断言匹配字符串中的数字。希望读者可以通过这些示例更好地理解正则表达式的应用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python正则表达式教程之二:捕获篇 - Python技术站