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模块的使用等。正则表达式虽然功能强大,但也非常复杂,需要花费较长的时间和精力去学习和掌握。在实际应用中,我们应该根据具体的需求和场景选择合适的正则表达式来解决问题。