python入门到脱坑正则——模式字符串

正则表达式(Regular Expression)是一种强劲的文本处理工具,Python通过re模块提供正则表达式支持。下面详细介绍正则表达式模式字符串的各个组成部分。

1. 基本匹配

普通字符

大多数普通字符(字母、数字)会直接匹配它们自身:

re.search(r'abc', 'abcdef')  # 匹配 'abc'

特殊字符

这些字符在正则表达式中有特殊含义,需要转义:

. ^ $ * + ? { } [ ]  | ( )

要匹配这些字符本身,需要在前面加反斜杠:

re.search(r'.', 'a.b')  # 匹配 '.'

2. 字符类

方括号表达式[]

匹配方括号中的任意一个字符:

re.search(r'[aeiou]', 'hello')  # 匹配 'e'
  • [abc]:匹配a、b或c
  • [a-z]:匹配任意小写字母
  • [0-9]:匹配任意数字
  • [^abc]:匹配不是a、b或c的字符

预定义字符类

模式

匹配内容

等价字符类

.

除换行符外的任意字符

d

数字字符

[0-9]

D

非数字字符

[^0-9]

s

空白字符(空格、制表符等)

[

fv]

S

非空白字符

[^

fv]

w

单词字符(字母、数字、下划线)

[a-zA-Z0-9_]

W

非单词字符

[^a-zA-Z0-9_]

3. 量词

量词指定前面元素出现的次数:

模式

描述

*

0次或多次(贪婪)

+

1次或多次(贪婪)

?

0次或1次

{m}

恰好m次

{m,}

至少m次

{m,n}

至少m次,至多n次

贪婪与非贪婪

默认是贪婪匹配(尽可能多匹配),在量词后加?变为非贪婪(尽可能少匹配):

re.search(r'a.*b', 'axbxb')   # 匹配 'axbxb'(贪婪)
re.search(r'a.*?b', 'axbxb')  # 匹配 'axb'(非贪婪)

4. 位置锚点

模式

描述

^

字符串开头(或多行模式的行首)

$

字符串结尾(或多行模式的行尾)

A

字符串开头

字符串结尾

单词边界

B

非单词边界

示例:

re.search(r'^hello', 'hello world')  # 匹配
re.search(r'world$', 'hello world')  # 匹配
re.search(r'Python', 'I love Python!')  # 匹配

5. 分组与捕获

基本分组()

re.search(r'(ab)+', 'ababab')  # 匹配 'ababab'

非捕获分组(?:…)

分组但不捕获:

re.search(r'(?:ab)+', 'ababab')  # 匹配但不捕获分组

命名分组(?P<name>…)

m = re.search(r'(?P<year>d{4})-(?P<month>d{2})', '2023-05')
print(m.group('year'))   # '2023'
print(m.group('month'))  # '05'

6. 特殊构造

模式

描述

`

`

或(匹配左边或右边)

(?#…)

注释

(?=…)

正向肯定预查(后面是…)

(?!…)

正向否定预查(后面不是…)

(?<=…)

反向肯定预查(前面是…)

(?<!…)

反向否定预查(前面不是…)

示例:

# 正向预查 - 匹配后面跟着.com的www
re.search(r'www(?=.com)', 'www.google.com')  # 匹配 'www'

# 反向预查 - 匹配前面有$的数字
re.search(r'(?<=$)d+', '价格: $100')  # 匹配 '100'

7. 标志修饰符

可以通过flags参数或内联标志使用:

标志

内联形式

描述

re.I

(?i)

忽略大小写

re.M

(?m)

多行模式

re.S

(?s)

使.匹配包括换行符

re.X

(?x)

忽略空白和注释

内联标志示例:

re.search(r'(?i)python', 'PYTHON')  # 匹配,忽略大小写

8. 常用模式示例

邮箱地址

r'[w.-]+@[w.-]+.w+'

URL

r'https?://(?:[-w.]|(?:%[da-fA-F]{2}))+'

IP地址

r'(?:d{1,3}.){3}d{1,3}'

HTML标签

r'<[^>]+>'

中文匹配

r'[u4e00-u9fa5]+'

9. 性能优化提议

  1. 预编译正则表达式
pattern = re.compile(r'd+')
pattern.search('abc123')
  1. 使用非捕获分组:当不需要捕获分组内容时
  2. 避免过度使用.:尽量使用更具体的字符类
  3. 避免回溯过多:如.*后面接具体匹配时思考使用非贪婪模式
  4. 使用原子组(Python 3.11+):
r'(?>ab|a)c'  # 原子组,一旦匹配不会回溯

掌握这些正则表达式模式将极大提升你的文本处理能力,适用于数据清洗、日志分析、表单验证等多种场景。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
芯皖幂的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容