正则表达式学习笔记

1. 资源链接

2.主要内容

1. 元字符(Metacharacters)

元字符是正则表达式中具有特殊含义的字符,匹配特定的字符类型或位置。以下是一些常用的元字符:

  • .: 匹配任意单个字符(换行符除外)。
  • ^: 匹配字符串的开始。
  • $: 匹配字符串的结束。
  • *: 匹配前面的字符 0 次或多次。
  • +: 匹配前面的字符 1 次或多次。
  • ?: 匹配前面的字符 0 次或 1 次。
  • {n}: 精确匹配前面的字符 n 次。
  • {n,}: 匹配前面的字符至少 n 次。
  • {n,m}: 匹配前面的字符至少 n 次,至多 m 次。
  • []: 匹配方括号内的任意一个字符,例如 [abc] 匹配 abc
  • |: 或运算符,匹配符号两边的任意一个模式,例如 a|b 匹配 ab
  • (): 捕获组,用于提取匹配的子串或在模式中应用量词。
  • \: 转义字符,用于匹配元字符本身或特殊的转义序列。
1.1 限定符 (Quantifier)

限定符用于指定前面的字符或表达式在目标字符串中出现的次数。

  • *: 匹配前面的字符 0 次或多次。
  • +: 匹配前面的字符 1 次或多次。
  • ?: 匹配前面的字符 0 次或 1 次。
  • {n}: 精确匹配 n 次。
  • {n,}: 至少匹配 n 次。
  • {n,m}: 匹配 n 到 m 次。

例如:

  • a*: 匹配 a 出现 0 次或多次。例如,"aaa""" 都可以匹配。
  • a+: 匹配 a 出现 1 次或多次。例如,"a""aaa" 可以匹配,但 "" 无法匹配。
  • a?: 匹配 a 出现 0 次或 1 次。例如,"a""" 可以匹配,但 "aa" 无法匹配。
  • a{6}: 匹配 a 精确出现 6 次。例如,"aaaaaa" 可以匹配。
  • a{2,6}: 匹配 a 出现 2 到 6 次之间。例如,"aa""aaa""aaaaaa" 可以匹配。
  • a{2,}: 匹配 a 出现至少 2 次。例如,"aa""aaaaaa" 可以匹配。
1.2 或运算符 (OR Operator)

或运算符用于在正则表达式中创建多个可选项。

  • (a|b): 匹配 ab 中的任意一个。例如,"a""b" 可以匹配。
  • (ab)|(cd): 匹配 abcd 之一。例如,"ab""cd" 可以匹配。
1.3 字符类 (Character Classes)

字符类用于匹配一组字符中的任意一个。

  • [abc]: 匹配 abc 中的任意一个字符。
  • [a-c]: 匹配 ac 之间的任意一个字符,这种形式用于表示字符的范围。
  • [a-fA-F0-9]: 匹配小写字母 af、大写字母 AF 以及数字 09。这通常用于匹配十六进制数字。
  • [^0-9]: 匹配非数字字符。^ 在字符类中表示取反。
1.4 贪婪/懒惰匹配 (Greedy / Lazy Match)

贪婪匹配和懒惰匹配用于控制量词的行为:

  • 默认情况下,量词是贪婪的,这意味着它会尽可能多地匹配字符。例如,<.+> 会匹配尽可能多的字符。
  • 使用 ? 使量词变为懒惰匹配,这样它会尽可能少地匹配字符。例如,<.+?> 会匹配尽可能少的字符。

2. 常见转义序列

  • \d: 匹配任何一个数字,相当于 [0-9]
  • \D: 匹配任何一个非数字字符。
  • \w: 匹配任何一个字母、数字或下划线,相当于 [a-zA-Z0-9_]
  • \W: 匹配任何一个非字母、数字或下划线的字符。
  • \s: 匹配任何一个空白字符(空格、制表符、换行符等)。
  • \S: 匹配任何一个非空白字符。

3. 边界匹配

  • ^: 匹配字符串的开始。例如 ^Hello 匹配以 Hello 开头的字符串。
  • $: 匹配字符串的结束。例如 world$ 匹配以 world 结尾的字符串。
  • \b: 匹配单词边界。例如 \bword\b 匹配完整的单词 word

图片中显示的内容包括了一些正则表达式的核心概念和操作符,以下是这些概念的详细讲解:

4. 捕获组和非捕获组

捕获组用于提取匹配到的子字符串:

  • (abc): 匹配 abc 并捕获该匹配结果。
  • (?:abc): 匹配 abc 但不捕获该匹配结果(非捕获组)。

捕获组在正则表达式中非常有用,特别是在匹配并提取子字符串时。

5. 零宽断言(Lookahead and Lookbehind)

零宽断言用于匹配位置,而不是匹配字符,它们不会消耗字符。

  • (?=pattern): 正向先行断言,匹配某个模式前的位置。
  • (?!pattern): 负向先行断言,匹配某个模式前不存在的位置。
  • (?<=pattern): 正向后行断言,匹配某个模式后的位置。
  • (?<!pattern): 负向后行断言,匹配某个模式后不存在的位置。

图片中显示的内容包括了一些正则表达式的核心概念和操作符,以下是这些概念的详细讲解:

3. 应用场景

  • 匹配字符串: 通过正则表达式查找、验证特定的字符串模式。
  • 提取信息: 使用捕获组从字符串中提取特定的信息。
  • 文本替换: 使用正则表达式替换文本中的某些部分。
  • 数据验证: 验证用户输入的数据格式是否正确,例如验证电子邮件、电话号码等。

4. 示例和实践

示例 1:匹配电子邮件地址
import re

email = "contact@example.com"
pattern = r'[\w\.-]+@[\w\.-]+'
match = re.match(pattern, email)

if match:
    print("Valid email address:", match.group())
else:
    print("Invalid email address")
示例 2:提取文本中的日期
import re

text = "Today's date is 2024-08-23."
pattern = r'\d{4}-\d{2}-\d{2}'
date = re.search(pattern, text)

if date:
    print("Found date:", date.group())
else:
    print("No date found")
示例 3:替换文本中的敏感信息
import re

text = "My credit card number is 1234-5678-9876-5432."
pattern = r'\d{4}-\d{4}-\d{4}-\d{4}'
safe_text = re.sub(pattern, "****-****-****-****", text)

print("Safe text:", safe_text)
示例 4:匹配 IPv6 地址
import re

# 示例中的IPv6地址
ipv6_address = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"

# 匹配IPv6地址的正则表达式模式
pattern = r'([0-9a-fA-F]{1,4}:){7}([0-9a-fA-F]{1,4})'

match = re.match(pattern, ipv6_address)

if match:
    print("Valid IPv6 address:", match.group())
else:
    print("Invalid IPv6 address")
  • [0-9a-fA-F]{1,4}: 匹配 1 到 4 个十六进制数字(0-9,a-f,A-F)。
  • :: 匹配冒号分隔符。
  • ([0-9a-fA-F]{1,4}:){7}: 匹配 7 组由冒号分隔的 1 到 4 个十六进制数字。
  • ([0-9a-fA-F]{1,4}): 匹配最后一组 1 到 4 个十六进制数字。
扩展:

IPv6 地址的表示形式可能会有所不同,比如可以使用缩略表示法(双冒号::),这种情况下,正则表达式会更复杂。如果要匹配完整的 IPv6 地址(包括可能的缩略表示),可以参考更复杂的模式,如:

pattern = r'(([0-9a-fA-F]{1,4}:){7}([0-9a-fA-F]{1,4})|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}){1,7})'

这个正则表达式考虑了 IPv6 地址中的缩写形式,但实现起来比较复杂,通常可以借助专门的库来解析和验证 IPv6 地址。

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值