Python Flask使用正则 模糊查询手机号
HDUZN

Flask写了个页面,用来查询数据库中的手机号对应的信息。

我想查询的就两种情况。

  • 精确查询
  • 模糊查询(分两种,号码不全和带*号的)

精确查询就不用说了,主要说一下两种模糊查询的情况。

第一种:号码不全的(不足11位)

在Flask中,数据库用的是SQLAlchemy类,所以没有直接写sql语句查询。用like就行了。

1
2
3
query_string = '13606735'
users = User.query.filter(User.phone.like(f'%{query_string}%')).all()
print(users)

第二种:带*号的

我这里是固定的格式,显示前3位和后3位,中间一串*号。比如:136*******322

思路:

  • 先把字符串切片,获取前3位和后3位;
  • 再把正则表达式的查询条件regex拼出来;
  • 最后在filter中用用text就行了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from sqlalchemy import text

query_string = '136*******322'
if '*' in query_string:
# 切割电话号码
phone_prefix = query_string[:3] # 获取前3位
phone_suffix = query_string[-3:] # 获取后3位

# 使用正则表达式查询以136开头手机号码的用户,这里的phone是对应的字段名
# users = User.query.filter(text("phone REGEXP '^136'")).params(regex=regex).all()

# 构造正则表达式查询条件 "^[1][3][6][0-9]{5}[3][2][2]$"
regex = f'^[{phone_prefix[0]}][{phone_prefix[1]}][{phone_prefix[2]}][0-9]{{5}}[{phone_suffix[0]}][{phone_suffix[1]}][{phone_suffix[2]}]$'
# print(regex) # ^[1][3][6][0-9]{5}[3][2][2]$
users = User.query.filter(text("phone REGEXP :regex")).params(regex=regex).all()
print(users)

这里对应直接用sql语句查询的话是:
select * from users where phone REGEXP "^[1][3][6][0-9]{5}[3][2][2]$"

完成一点的代码片就是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text

def query_test():
query_tel = '136*******322'
if len(query_tel) == 11 and query_tel.isdigit():
# 精确查询 13676666322
user = User.query.filter_by(phone=query_tel).first()
print(user)
else:
# 模糊查询 136*******322
if '*' in query_tel:
# 切割电话号码
phone_prefix = query_tel[:3] # 获取前3位
phone_suffix = query_tel[-3:] # 获取后3位

# 使用正则表达式查询以136开头手机号码的用户
# users = User.query.filter(text("phone REGEXP '^136'")).params(regex=regex).all()

# 构造正则表达式查询条件 "^[1][3][6][0-9]{5}[3][2][2]$"
regex = f'^[{phone_prefix[0]}][{phone_prefix[1]}][{phone_prefix[2]}][0-9]{{5}}[{phone_suffix[0]}][{phone_suffix[1]}][{phone_suffix[2]}]$'
print(regex) # ^[1][3][6][0-9]{5}[3][2][2]$
users = User.query.filter(text("phone REGEXP :regex")).params(regex=regex).all()
else:
users = User.query.filter(User.phone.like(f'%{query_tel}%')).all()
print(users)

query_test()
  • 本文标题:Python Flask使用正则 模糊查询手机号
  • 本文作者:HDUZN
  • 创建时间:2023-05-10 22:22:06
  • 本文链接:http://hduzn.cn/2023/05/10/Python-Flask使用正则模糊查询手机号/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论