Python正则表达式匹配任意字符串

Python正则表达式匹配任意字符串

正则表达式是一种强大的字符串匹配工具,它可以在字符串中按照一定的模式匹配和查找指定的字符、字符串、数字等,不仅可以用于字符串匹配,也可以用于格式校验、数据提取等方面。Python中内置了re模块,以支持正则表达式。

什么是正则表达式?

正则表达式(英文名:regular expression,缩写:regex、regexp)是一种语法规则,用于定义字符串的匹配模式。正则表达式通常使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。

例如,在使用Python时,我们可能需要快速地判断一个字符串是否符合 email 地址的格式。此时,可以使用正则表达式来进行验证:

import re

def is_valid_email(addr):
    # 定义一个规则匹配模式,其中“\w”表示字母或数字,“\.+”表示至少一个连续的“.”号
    re_email = re.compile(r'^\w+\.?\w+@\w+\.\w+$')
    if re_email.match(addr):
        return True
    else:
        return False

assert is_valid_email('someone@gmail.com')
assert is_valid_email('bill.gates@microsoft.com')
assert not is_valid_email('bob#example.com')
assert not is_valid_email('mr-bob@example.com')

代码中使用re.compile方法定义了一个规则匹配模式,其中r表示采用 Raw String 的方式。匹配地址时返回True,不匹配返回False。

正则表达式语法

正则表达式的语法非常复杂,但是其中的基本组成部分包括:

  • 字符组:用[]表示,表示需要匹配的字符的集合。
    • [a-z]表示匹配小写字母a到z中任意一个字母;
    • [A-Z]表示匹配大写字母A到Z中任意一个字母;
    • [0-9]表示任意一个数字;
    • []里面的^表示匹配不包含的字符。
    • [a-zA-Z0-9_]表示匹配任何一个小写字母、大写字母、数字和下划线。
  • 量词:用{}表示,用于指定某个字符出现的次数。
    • {n}表示匹配n次;
    • {n,}表示匹配至少n次;
    • {n,m}表示匹配n到m次。
  • 特殊字符:包括一些特殊的字符,例如?、+、*、.等,这些字符都有特殊的含义。
  • 转义字符:用\表示,用于匹配一些特殊的字符,例如\?、+、*、.等。
  • 分组、捕获:用()表示,用于分组操作。
    • 在分组中,\1表示引用分组中的第1个匹配项,\2表示引用分组中的第2个匹配项,以此类推。在代码中可用group方法获得。
    • 在捕获中,通过正则表达式提取字符串的一部分信息。

下面是正则表达式一些常用符号对应的意义:

符号 说明
. 匹配任意一个字符
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
? 匹配前面的字符零次或一次
^ 匹配字符串开头
$ 匹配字符串结尾
\ 转义字符
[] 匹配括号中的任意一个字符
[^] 匹配不在括号中的任意一个字符
() 分组操作
| 匹配左右两边任意一个表达式

re模块的使用

Python中内置了re模块,以支持正则表达式。re模块提供了许多方法,用法如下:

import re

# 匹配函数
re.match(pattern, string, flags=0)
re.search(pattern, string, flags=0)
re.findall(pattern, string, flags=0)
re.finditer(pattern, string, flags=0)

# 替换函数
re.sub(pattern, repl, string, count=0, flags=0)
re.subn(pattern, repl, string, count=0, flags=0)

# 编译函数
re.compile(pattern, flags=0)
  • match()函数:从字符串的开头匹配一个模式。如果不是开头,匹配不到,返回None。如果匹配成功,返回一个match对象,可以调用group()方法返回匹配结果。
  • search()函数:在字符串中查找模式,找到一个就返回一个对象,可以调用group()方法返回匹配结果。和match()函数的区别是,search()函数可以从字符串的任意位置开始匹配。
  • findall()函数:返回所有匹配的结果,返回值类型为列表类型。
  • finditer()函数:返回所有匹配的结果,返回值类型为迭代器。
  • sub()函数:替换匹配的子字符串并返回替换后的字符串。
  • subn()函数:替换匹配的子字符串,并返回一个元组,元素为替换后的字符串和替换的次数。
  • compile()函数:编译字符串,返回一个正则表达式对象。这个对象可以调用其他re模块中的函数。

下面是一些常见的正则表达式示例:

import re

# 匹配邮政编码
p_1 = re.compile(r'^[1-9]\d{5}')
r_1 = p_1.match('100101')
print(r_1.group())  # 100101

# 匹配电话号码
p_2 = re.compile(r'^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}')
r_2 = p_2.match('0755-86698689')
print(r_2.group())  # 0755-86698689

# 匹配IP地址
p_3 = re.compile(r'(([01]?\d{1,2}|2[0-4]\d|25[0-5]).){3}([01]?\d{1,2}|2[0-4]\d|25[0-5])')
r_3 = p_3.match('192.168.0.1')
print(r_3.group())  # 192.168.0.1

# 匹配链接
p_4 = re.compile(r'(https?://)?[a-zA-Z0-9._-]+\.[a-zA-Z]{2,6}(/)?(\?\w+=\w+(&\w+=\w+)*)?')
r_4 = p_4.findall('This is a link http://www.example.com/index.php?id=123&pid=456')
print(r_4)  # [('http://', '', '', ''), ('', 'www.example.com', '/index.php', 'id=123&pid=456')]

# 匹配HTML标签
p_5 = re.compile(r'<(\S*?)[^>]*>.*?</\1>|<.*?/>')
r_5 = p_5.findall('<div>hello</div><p>world</p><br/>')
print(r_5)  # ['<div>hello</div>', '<p>world</p>', '<br/>']

上述代码中,使用re.compile()函数定义了几个常见的正则表达式,用于匹配邮政编码、电话号码、IP地址、链接和HTML标签。

结论

本文介绍了Python中使用正则表达式匹配任意字符串的方法,包括正则表达式语法、re模块的使用等。正则表达式虽然功能强大,但也非常复杂,需要花费较长的时间和精力去学习和掌握。在实际应用中,我们应该根据具体的需求和场景选择合适的正则表达式来解决问题。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程