自学内容网 自学内容网

正则表达式的高级方法

正则表达式的高级方法

正则表达式(regex)不仅仅是简单的模式匹配工具,它还提供了一系列高级功能,使得处理复杂文本任务变得更加灵活和强大。以下是一些Python中正则表达式的高级用法:

1. 命名捕获组

命名捕获组允许你为每个捕获的子表达式赋予一个名称,这在处理复杂的匹配时特别有用,因为它可以提高代码的可读性和维护性。

import re

pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
match = re.match(pattern, '2023-10-12')

if match:
    print(f"Year: {match.group('year')}, Month: {match.group('month')}, Day: {match.group('day')}")
2. 非捕获组

有时候你可能只想分组某些部分的表达式而不希望它们被单独捕获,这时可以使用非捕获组(?:...)

pattern = r'(?:\d{3}-){2}\d{4}'  # 匹配形如123-456-7890的电话号码
matches = re.findall(pattern, 'My numbers are 123-456-7890 and 987-654-3210.')
print(matches)  # 输出: ['123-456-7890', '987-654-3210']
3. 前瞻断言与后瞻断言

这些是用于指定匹配条件的特殊构造,但不消耗字符。前瞻断言(?=...)确保当前位置之后的字符串符合某个模式;后瞻断言(?<=...)确保当前位置之前的字符串符合某个模式。

# 前瞻断言:查找所有后面跟着'.com'的单词
pattern = r'\b\w+(?=\.com\b)'
text = "example.com is a website."
print(re.findall(pattern, text))  # 输出: ['example']

# 后瞻断言:查找所有前面有'@'符号的单词
pattern = r'(?<=@)\w+'
text = "Email me at user@example.com"
print(re.findall(pattern, text))  # 输出: ['example']
4. 惰性量词

默认情况下,量词(如*, +, ?)是贪婪的,这意味着它们会尽可能多地匹配字符。使用惰性量词(通过在量词后加?),可以让它们尽可能少地匹配字符。

html = '<div>First paragraph</div><div>Second paragraph</div>'
pattern = r'<div>(.*?)</div>'  # 使用惰性量词'?'
matches = re.findall(pattern, html)
print(matches)  # 输出: ['First paragraph', 'Second paragraph']
5. 条件表达式

条件表达式(?(id/name)yes-pattern|no-pattern)允许根据是否匹配了某个特定的组来决定接下来的匹配规则。

pattern = r'^(?:(?P<int>\d+)|(?P<float>\d+\.\d+))$'
match = re.match(pattern, '123.45')
if match:
    if match.group('int'):
        print("Integer:", match.group('int'))
    elif match.group('float'):
        print("Float:", match.group('float'))
6. 内联标志

可以在正则表达式的某些部分内部启用或禁用标志,而不需要在整个表达式中都应用该标志。例如,(?i)表示忽略大小写的匹配,只影响其后的部分。

pattern = r'(?i)hello world'  # 忽略大小写
text = "Hello World"
print(bool(re.search(pattern, text)))  # 输出: True
7. 回溯限制

为了优化性能,避免不必要的回溯,可以使用原子组(?>)...来阻止回溯进入括号内的表达式。

pattern = r'(?>(?:\d{3}-){2}\d{4})'  # 原子组防止回溯
text = "Call me at 123-456-7890 or 987-654-3210."
matches = re.findall(pattern, text)
print(matches)  # 输出: ['123-456-7890', '987-654-3210']
8. 递归模式

对于嵌套结构的数据(如HTML标签、括号等),可以使用递归模式(?R)来匹配任意深度的嵌套。

pattern = r'\((?:[^()]*|(?R))*\)'  # 匹配嵌套括号
text = "(This (is (a test)) string)"
matches = re.findall(pattern, text)
print(matches)  # 输出: ['(is (a test))']

原文地址:https://blog.csdn.net/m0_73737898/article/details/144387029

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!