实用正则表达式归纳
根据日常工作、学习经常用到的场景总结归纳如下表所示:
结合小示例如下:
匹配用户名
import re
user_names = ['abc123','user_name12','test-123','name@123', 'ab', 'User123']
pattern = re.compile('^[0-9a-z_-]{3,16}$')
for user in user_names:
if pattern.match(user):
print('matched: ', user)
else:
print('No matched!')
运行结果如下:
matched: abc123
matched: user_name12
matched: test-123
No matched!
No matched!
No matched!
说明:这个正则表达式 ^[0-9a-z_-]{3,16}$ 的含义是:匹配长度在 3 到 16 之间的由数字、小写字母、下划线和短横线组成的字符串。
下面是一些匹配和不匹配的示例:
匹配:
- abc123
- user_name12
- test-123
不匹配:
- ab(长度不足)
- User123(包含大写字母)
- name@123(包含特殊字符)
这个正则表达式可用于验证用户注册名、用户名、密码等情况,要求长度在3到16位,并且只包含数字、小写字母、下划线和短横线。
匹配密码
import re
passwords = ['abc123','admin_12','password-1234','name@123', 'ab', 'Abc123']
pattern = re.compile('^[0-9a-z_-]{6,18}$')
for password in passwords:
if pattern.match(password):
print('matched: ', password)
else:
print('No matched!')
运行结果如下:
matched: abc123
matched: admin_12
matched: password-1234
No matched!
No matched!
No matched!
说明:这个正则表达式 ^[a-z0-9_-]{6,18}$ 的含义是:匹配长度在 6 到 18 之间的由小写字母、数字、下划线和短横线组成的字符串。
以下是一些示例,说明哪些符合该正则表达式,哪些不符合:
匹配:
- abc123
- admin_12
- password-1234
不匹配:
- abc(长度不足)
- Abc123(包含大写字母)
- name@123(包含特殊字符)
这个正则表达式适用于验证密码、用户名等情况,要求长度在 6 到 18 位,并且只包含小写字母、数字、下划线和短横线。
手机号码
import re
mobile_nums = ['13612345678','+8613912345678','13888888888', '32345678901','+86111223344','1361234']
pattern = re.compile('^(?:\+86)?1[3-9]\d{9}$')
for mobile in mobile_nums:
if pattern.match(mobile):
print('matched: ', mobile)
else:
print('No matched!')
运行结果如下:
matched: 13612345678
matched: +8613912345678
matched: 13888888888
No matched!
No matched!
No matched!
说明:这个正则表达式 ^(?:+86)?1[3-9]\d{9}$ 的含义是:匹配中国大陆手机号码,可以带有国家代码 +86 或不带,在国家代码后面紧跟以 1 开头的手机号码,其中第二位为 3 到 9 之间的数字,后面跟着任意 9 个数字字符。
以下是一些示例,说明哪些符合该正则表达式,哪些不符合:
匹配:
- 13612345678
- +8613912345678
- 13888888888
不匹配:
- 32345678901(不是以 1 开头)
- +86111223344(号段不在 3 到 9 之间)
- 1361234(长度不足)
这个正则表达式适用于验证中国大陆手机号码格式,满足指定的要求。
颜色的十六进制
import re
colors = ['#ffffff','#123abc','abc','1234567','#12ab','#xyz123']
pattern = re.compile('^#?([a-f0-9]{6}|[a-f0-9]{3})$')
for color in colors:
if pattern.match(color):
print('matched: ', color)
else:
print('No matched!')
运行结果如下:
matched: #ffffff
matched: #123abc
matched: abc
No matched!
No matched!
No matched!
说明:这个正则表达式 ^#?([a-f0-9]{6}|[a-f0-9]{3})$ 的含义是:匹配十六进制颜色代码,可以以 # 开头或不以 # 开头,后面跟着 3 位或者 6 位由 0-9 和 a-f 组成的字符。
以下是一些示例,说明哪些符合该正则表达式,哪些不符合:
匹配:
- #ffffff
- #123abc
abc
不匹配:
- 1234567(超过 6 位)
- #12ab(未满足 3 或 6 位)
- #xyz123(包含非法字符)
这个正则表达式适用于验证十六进制颜色代码的格式,确保符合指定的长度和字符范围。
电子邮箱
import re
emails = ['example123@email.com','user.name123@example.co.uk','user+test@sub.domain.com','invalid.email@domain','email@domain..com','user name@email.com']
pattern = re.compile('\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}')
for email in emails:
if pattern.match(email):
print('matched: ', email)
else:
print('No matched!')
运行结果如下:
matched: example123@email.com
matched: user.name123@example.co.uk
matched: user+test@sub.domain.com
No matched!
No matched!
No matched!
说明:这个正则表达式 \w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14} 的含义是匹配标准的邮箱地址格式。下面是一些示例说明:
- 用户名部分
`\w[-\w.+]*
:允许包含字母、数字以及一些特殊字符(例如点号、下划线、百分号、加号和减号)。 - @符号 @:必须包含 @ 符号。
- 域名部分 [A-Za-z0-9][-A-Za-z0-9]+.:可以包含字母、数字以及连字符和点号(用于子域名)。
- 顶级域名 [A-Za-z]{2,14}:至少包含两个字母,用于匹配常见的顶级域名(如com、net、org等)。
匹配:
- example123@email.com
- user.name123@example.co.uk
- user+test@sub.domain.com
不匹配:
- invalid.email@domain(顶级域名不足两个字符)
- email@domain..com(连续的点号)
- user name@email.com(包含空格)
该正则表达式能够有效匹配常见的邮箱地址格式,确保符合用户名、@符号、域名和顶级域名的标准。
URL
import re
pattern = re.compile('^(https?:\/\/)?([a-z\d-]+\.)+[a-z]{2,}(\/[\w\d%+\-./]*)*$')
url_lst = ['https://www.example.com','http://subdomain.domain.co.uk/page1','https://www.example.com/path/to/page.html''ftp://example.com','https://www.example.com?query=123','http://www.example.invalid']
for url in url_lst:
if pattern.match(url):
print('matched: ', url)
else:
print('No matched!')
运行结果如下:
matched: https://www.example.com
matched: http://subdomain.domain.co.uk/page1
No matched!
No matched!
matched: http://www.example.invalid
说明:这个正则表达式 ^(https?:\/\/)?([a-z\d-]+.)+[a-z]{2,}(\/[\w\d%+-./])$ 用于匹配常见的 URL 格式。以下是一些示例说明:
匹配:
- https://www.example.com
- http://subdomain.domain.co.uk/page1
- https://www.example.com/path/to/page.html
不匹配:
- ftp://example.com(不匹配所支持的协议)
- https://www.example.com?query=123(未考虑查询字符串)
这个正则表达式能够有效匹配常见的 URL 格式,包括协议、域名、顶级域名和路径部分,但可能需要根据具体需求进一步调整以包含更多可能的情况。
IP地址
import re
pattern = re.compile('((2[0-4]\d|25[0-5]|[01]?\d\d?)\\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)')
ipv4_lst = ['192.168.1.1','255.255.255.0','10.0.0.1','256.168.1.1','192.168.1.','1.1.1']
for ip in ipv4_lst:
if pattern.match(ip):
print('matched: ', ip)
else:
print('No matched!')
运行结果如下:
matched: 192.168.1.1
matched: 255.255.255.0
matched: 10.0.0.1
No matched!
No matched!
No matched!
说明:这个正则表达式 ((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 用于匹配 IPv4 地址格式,其中每个数字范围是从 0 到 255。以下是一些示例说明:
匹配:
- 192.168.1.1
- 255.255.255.0
- 10.0.0.1
不匹配:
- 256.168.1.1(超出了允许的范围)
- 192.168.1.(末尾缺少数字)
- 1.1.1(缺少完整的四组数字)
这个正则表达式能够有效匹配符合标准 IPv4 地址格式的字符串,确保每个数字在 0 到 255 的范围内。
这个正则表达式 ((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 的语法可以解释如下:
( 和 ):用于分组,将其中的内容视为一个整体。
(2[0-4]\d|25[0-5]|[01]?\d\d?):表示匹配 0 到 255 之间的数字。具体说明如下:
2[0-4]\d:匹配 200 到 249 之间的数字。
25[0-5]:匹配 250 到 255 之间的数字。
[01]?\d\d?:匹配 0 到 199 之间的数字,包括各种可能的组合(如 01、10、100 等)。
(2[0-4]\d|25[0-5]|[01]?\d\d?).:匹配三组符合上述范围内的数字后跟一个点号。
{3}:指定前面的分组恰好重复三次。
(2[0-4]\d|25[0-5]|[01]?\d\d?):匹配最后一组符合条件的数字。
这个正则表达式的结构设计得很巧妙,能够有效地匹配符合 IPv4 地址格式的字符串,确保每个数字在正确的范围内,并使用点号作为分隔符。
HTML标签
import re
pattern = re.compile('^<([a-z]+)([^<])*(?:>(.*)<\\/\\1>)$')
html_lst = ['<div>Hello</div>','<p>This is a paragraph</p>','<span class="highlight">Highlighted text</span>','<strong>Bold text','<ul><li>Item 1</li></ul>','<a href="example.com">Link</a>']
for html in html_lst:
if pattern.match(html):
print('matched: ', html)
else:
print('No matched!')
运行结果如下:
matched: <div>Hello</div>
matched: <p>This is a paragraph</p>
matched: <span class="highlight">Highlighted text</span>
No matched!
matched: <ul><li>Item 1</li></ul>
matched: <a href="example.com">Link</a>
说明:这个正则表达式 ^<([a-z]+)([^<])(?:>(.)<\/\1>)$ 用于匹配简单的 HTML 标签。以下是一些示例说明:
匹配:
-
Hello
This is a paragraph
- Highlighted text
-
- Item 1
- Link
不匹配:
- Bold text
在上述示例中,只有与正则表达式匹配的 HTML 标签会被识别,因为正则表达式要求标签要有正确的开头和闭合,并且内容要符合标签名称。
utf-8编码下的汉字范围
import re
pattern = re.compile('^[\u2E80-\u9FFF]+')
utf_lst = ['你好世界, 中文测试','Hello 你好, 12345']
for utf in utf_lst:
if pattern.match(utf):
print('matched: ', utf)
else:
print('No matched!')
运行结果如下:
matched: 你好世界, 中文测试
No matched
说明:这个正则表达式 ^[\u2E80-\u9FFF]+ 用于匹配中文字符范围(包括繁体字),Unicode 范围为 \u2E80 到 \u9FFF。这表示匹配从中文第一个汉字(四角号码为2000)到最后一个汉字(四角号码为9FFF)之间的所有字符。
这个正则表达式将只匹配完全由中文字符组成的字符串,而不会匹配包含其他类型字符的字符串。
示例:
- 匹配:你好世界, 中文测试
- 不匹配:Hello 你好, 12345
总体来说,这个正则表达式适用于需要验证输入是否仅包含中文字符的情况。
- 0-9a-z_- ↩︎
- a-z0-9_- ↩︎
- \u2E80-\u9FFF ↩︎