实用正则表达式归纳
根据日常工作、学习经常用到的场景总结归纳如下表所示:
场景 | 正则表达式 |
---|---|
用户名 | ^[1](#?([a-f0-9]{6} |
密码 | ^[2](#?([a-f0-9]{6} |
手机号码 | ^(?:+86)?1[3-9]\d{9}$ |
颜色的十六进制值 | ^#?([a-f0-9]{6}|[a-f0-9]{3})$ |
电子邮箱 | \w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14} |
URL | ^(https?😕/)?([a-z\d-]+.)+[a-z]{2,}(/[\w\d%+-./])$ |
IP地址 | ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) |
HTML标签 | ^<([a-z]+)([^<])(?:>(.)<\/\1>)$ |
utf-8编码下的汉字范围 | ^[3](#?([a-f0-9]{6} |
结合小示例如下:
-
匹配用户名
pythonimport 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位,并且只包含数字、小写字母、下划线和短横线。
-
-
匹配密码
pythonimport 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 位,并且只包含小写字母、数字、下划线和短横线。
-
-
手机号码
pythonimport 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
(长度不足)
这个正则表达式适用于验证中国大陆手机号码格式,满足指定的要求。
-
-
颜色的十六进制
pythonimport 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
(包含非法字符)
这个正则表达式适用于验证十六进制颜色代码的格式,确保符合指定的长度和字符范围。
-
-
电子邮箱
pythonimport 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
pythonimport 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地址
pythonimport 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标签
pythonimport 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 标签。以下是一些示例说明:- 匹配 :
<div>Hello</div>
<p>This is a paragraph</p>
<span class="highlight">Highlighted text</span>
<ul><li>Item 1</li></ul>
<a href="example.com">Link</a>
- 不匹配 :
<strong>Bold text
在上述示例中,只有与正则表达式匹配的 HTML 标签会被识别,因为正则表达式要求标签要有正确的开头和闭合,并且内容要符合标签名称。
- 匹配 :
-
utf-8编码下的汉字范围
python
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
总体来说,这个正则表达式适用于需要验证输入是否仅包含中文字符的情况。
以上示例均在[小蜜蜂AI网站][https://zglg.work]的GPT问答实现。