PYTHON基础技能 – Python中利用正则表达式的16个常见任务

释放双眼,带上耳机,听听看~!

1. 正则表达式是什么?

正则表达式是一种用于匹配字符串的语言。它由一系列字符和特殊符号组成,用来描述搜索模式。在Python中,

1
re

模块提供了支持正则表达式的功能。

2. 安装与导入

首先,确保你的Python环境中已经安装了

1
re

模块。这是Python的标准库之一,所以通常不需要额外安装。


1
import re

3. 字符匹配

  • 单个字符:使用方括号
    1
    []

    表示一组字符中的任意一个。


1
<em>#&nbsp;匹配任何字母</em><br>pattern&nbsp;=&nbsp;"&#091;a-zA-Z]"<br>string&nbsp;=&nbsp;"Hello&nbsp;World!"<br>match&nbsp;=&nbsp;re.search(pattern,&nbsp;string)<br>print(match.group())&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;H</em>
  • 多个字符:使用
    1
    *

    表示零次或多次出现。


1
<em>#&nbsp;匹配任意数量的空格</em><br>pattern&nbsp;=&nbsp;"\s*"<br>string&nbsp;=&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;Hello&nbsp;World!"<br>match&nbsp;=&nbsp;re.match(pattern,&nbsp;string)<br>print(match.group())&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp;'</em>

4. 范围匹配

  • 使用
    1
    -

    定义一个范围内的字符。


1
<em>#&nbsp;匹配小写字母a到e</em><br>pattern&nbsp;=&nbsp;"&#091;a-e]"<br>string&nbsp;=&nbsp;"abcdeABCDE"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'a',&nbsp;'b',&nbsp;'c',&nbsp;'d',&nbsp;'e']</em>

5. 排除字符

  • 使用
    1
    ^

    排除某些字符。


1
<em>#&nbsp;匹配除了a到z之外的所有字符</em><br>pattern&nbsp;=&nbsp;"&#091;^a-z]"<br>string&nbsp;=&nbsp;"123ABCdef"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'1',&nbsp;'2',&nbsp;'3',&nbsp;'A',&nbsp;'B',&nbsp;'C']</em>

6. 字符集组合

  • 可以将多个字符集组合起来使用。

1
<em>#&nbsp;匹配数字或大写字母</em><br>pattern&nbsp;=&nbsp;"&#091;0-9A-Z]+"<br>string&nbsp;=&nbsp;"Hello123World"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'123']</em>

7. 位置锚定

  • 1
    ^

    表示行首,

    1
    $

    表示行尾。


1
<em>#&nbsp;匹配以大写字母开头的单词</em><br>pattern&nbsp;=&nbsp;"^&#091;A-Z]&#091;a-zA-Z]*"<br>string&nbsp;=&nbsp;"Hello&nbsp;world"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'Hello']</em>

8. 分组与引用

  • 使用圆括号
    1
    ()

    来创建一个捕获组。


1
<em>#&nbsp;捕获日期格式</em><br>pattern&nbsp;=&nbsp;"(\d{4})-(\d{2})-(\d{2})"<br>string&nbsp;=&nbsp;"Today&nbsp;is&nbsp;2023-04-01."<br>match&nbsp;=&nbsp;re.match(pattern,&nbsp;"2023-04-01")<br>if&nbsp;match:<br>&nbsp;&nbsp;&nbsp;&nbsp;year&nbsp;=&nbsp;match.group(1)<br>&nbsp;&nbsp;&nbsp;&nbsp;month&nbsp;=&nbsp;match.group(2)<br>&nbsp;&nbsp;&nbsp;&nbsp;day&nbsp;=&nbsp;match.group(3)<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Year:&nbsp;{year},&nbsp;Month:&nbsp;{month},&nbsp;Day:&nbsp;{day}")

9. 非捕获组

  • 如果不关心某部分的内容,可以使用
    1
    (?:)


1
<em>#&nbsp;不捕获中间的冒号</em><br>pattern&nbsp;=&nbsp;r"(\d{2}):(?:\d{2}):\d{2}"<br>string&nbsp;=&nbsp;"09:30:15"<br>match&nbsp;=&nbsp;re.match(pattern,&nbsp;string)<br>if&nbsp;match:<br>&nbsp;&nbsp;&nbsp;&nbsp;hour&nbsp;=&nbsp;match.group(1)<br>&nbsp;&nbsp;&nbsp;&nbsp;print(hour)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;09</em>

10. 替换文本

  • 使用
    1
    re.sub()

    方法替换字符串中的匹配项。


1
<em>#&nbsp;将所有空格替换成下划线</em><br>pattern&nbsp;=&nbsp;"\s+"<br>string&nbsp;=&nbsp;"Hello&nbsp;&nbsp;&nbsp;World"<br>new_string&nbsp;=&nbsp;re.sub(pattern,&nbsp;"_",&nbsp;string)<br>print(new_string)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;Hello_World</em>

11. 贪婪与非贪婪匹配

  • 贪婪匹配:默认情况下,正则表达式会尽可能多地匹配字符。
  • 非贪婪匹配:使用
    1
    ?

    使匹配变得“懒惰”,即尽可能少地匹配字符。


1
<em>#&nbsp;贪婪匹配</em><br>pattern&nbsp;=&nbsp;"&lt;.*&gt;"<br>string&nbsp;=&nbsp;"&lt;p&gt;Hello&nbsp;&lt;span&gt;World&lt;/span&gt;&lt;/p&gt;"<br>match&nbsp;=&nbsp;re.search(pattern,&nbsp;string)<br>print(match.group())&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&lt;p&gt;Hello&nbsp;&lt;span&gt;World&lt;/span&gt;&lt;/p&gt;</em><br><br><em>#&nbsp;非贪婪匹配</em><br>pattern&nbsp;=&nbsp;"&lt;.*?&gt;"<br>string&nbsp;=&nbsp;"&lt;p&gt;Hello&nbsp;&lt;span&gt;World&lt;/span&gt;&lt;/p&gt;"<br>match&nbsp;=&nbsp;re.search(pattern,&nbsp;string)<br>print(match.group())&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&lt;p&gt;</em>

12. 条件分支

  • 使用
    1
    (?P&lt;name&gt;)

    命名捕获组,并通过

    1
    (?P=name)

    引用它们。


1
<em>#&nbsp;匹配重复的单词</em><br>pattern&nbsp;=&nbsp;r"\b(\w+)\b\s+\1\b"<br>string&nbsp;=&nbsp;"hello&nbsp;hello&nbsp;world"<br>match&nbsp;=&nbsp;re.sub(pattern,&nbsp;r"\1",&nbsp;string,&nbsp;flags=re.IGNORECASE)<br>print(match)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;hello&nbsp;world</em>

13. 重复限定符

  • 使用
    1
    {n}

    指定精确重复次数。

  • 使用
    1
    {n,}

    指定至少重复n次。

  • 使用
    1
    {n,m}

    指定重复n到m次。


1
<em>#&nbsp;匹配恰好重复三次的字符</em><br>pattern&nbsp;=&nbsp;r"a{3}"<br>string&nbsp;=&nbsp;"aaabbbccc"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;]</em><br><br><em>#&nbsp;匹配至少重复两次的字符</em><br>pattern&nbsp;=&nbsp;r"a{2,}"<br>string&nbsp;=&nbsp;"aaabbbccc"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'aaa']</em><br><br><em>#&nbsp;匹配重复两到四次的字符</em><br>pattern&nbsp;=&nbsp;r"a{2,4}"<br>string&nbsp;=&nbsp;"aaabbbccc"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'aaa']</em>

14. 特殊字符

  • 点号
    1
    .

    :匹配除换行符之外的任何字符。

  • 反斜杠
    1
    \

    :转义特殊字符。


1
<em>#&nbsp;匹配包含任何字符的单词</em><br>pattern&nbsp;=&nbsp;r"\w+"<br>string&nbsp;=&nbsp;"hello\nworld"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'hello']</em><br><br><em>#&nbsp;匹配特殊字符</em><br>pattern&nbsp;=&nbsp;r"\."<br>string&nbsp;=&nbsp;"hello.world"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'.']</em>

15. 边界限定符

  • 单词边界
    1
    \b

    :匹配单词的开始和结束。

  • 非单词边界
    1
    \B

    :匹配非单词的位置。


1
<em>#&nbsp;匹配单词边界</em><br>pattern&nbsp;=&nbsp;r"\bhello\b"<br>string&nbsp;=&nbsp;"hello&nbsp;world"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'hello']</em><br><br><em>#&nbsp;匹配非单词边界</em><br>pattern&nbsp;=&nbsp;r"\Bworld\B"<br>string&nbsp;=&nbsp;"hello&nbsp;world"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;]</em>

16. 标志位

  • 忽略大小写
    1
    re.IGNORECASE

    :使匹配不区分大小写。

  • 多行模式
    1
    re.MULTILINE

    :使

    1
    ^

    1
    $

    分别匹配每一行的开始和结束。

  • 点号匹配换行符
    1
    re.DOTALL

    :使

    1
    .

    匹配包括换行符在内的任何字符。


1
<em>#&nbsp;忽略大小写</em><br>pattern&nbsp;=&nbsp;r"hello"<br>string&nbsp;=&nbsp;"Hello&nbsp;world"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string,&nbsp;re.IGNORECASE)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'Hello']</em><br><br><em>#&nbsp;多行模式</em><br>pattern&nbsp;=&nbsp;r"^hello"<br>string&nbsp;=&nbsp;"hello\nworld"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string,&nbsp;re.MULTILINE)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'hello']</em><br><br><em>#&nbsp;点号匹配换行符</em><br>pattern&nbsp;=&nbsp;r"hello.*world"<br>string&nbsp;=&nbsp;"hello\nworld"<br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string,&nbsp;re.DOTALL)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'hello\nworld']</em>

实战案例分析

假设我们需要从一段文本中提取所有的邮箱地址。这可以通过正则表达式轻松实现。邮箱地址的一般形式为

1
username@domain.com

。下面是一个简单的示例:


1
<em>#&nbsp;提取邮箱地址</em><br>pattern&nbsp;=&nbsp;r"&#091;a-zA-Z0-9._%+-]+@&#091;a-zA-Z0-9.-]+\.&#091;a-zA-Z]{2,}"<br>string&nbsp;=&nbsp;"""<br>John&nbsp;Doe&nbsp;&lt;johndoe@example.com&gt;<br>Jane&nbsp;Smith&nbsp;&lt;janesmith@company.org&gt;<br>"""<br><br>matches&nbsp;=&nbsp;re.findall(pattern,&nbsp;string)<br>print(matches)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;'johndoe@example.com',&nbsp;'janesmith@company.org']</em>

给TA打赏
共{{data.count}}人
人已打赏
安全运维

安全运维之道:发现、解决问题的有效闭环

2024-4-14 20:59:36

安全运维

稳定性建设 – 架构优化的关键策略

2025-2-11 17:15:56

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索