如何实现单端含额外段的字符串匹配?Python/SQL方案咨询
解决方案:字符串前缀匹配逻辑(Python + SQL)
匹配规则明确
仅满足以下任一条件时视为匹配:
- 两个字符串完全相等
- 其中一个字符串是另一个的完整前缀(即较短字符串是较长字符串的开头部分,较长字符串仅在末尾有额外内容)
双方均包含不同额外内容时(如示例2),不匹配。
Python 实现
直接通过字符串前缀判断实现,避免原有方法的误匹配问题:
def is_match(db_str, foreign_str): # 预处理:去除首尾空格并统一小写(可选,根据需求调整) db_clean = db_str.strip().lower() foreign_clean = foreign_str.strip().lower() # 全匹配判断 if db_clean == foreign_clean: return True # 判断其中一个是否为另一个的前缀 len_db = len(db_clean) len_for = len(foreign_clean) if len_db > len_for: return db_clean.startswith(foreign_clean) else: return foreign_clean.startswith(db_clean)
测试示例
- 示例1:
is_match("David James Malan Neeko", "David James Malan")→ 返回True(库内字符串是外部字符串的扩展) - 示例2:
is_match("David James Malan Neeko", "David James Malan Mathew")→ 返回False(双方各有不同额外内容) - 示例3:
is_match("David James Malan Neeko", "David jam Mlan")→ 返回False(拼写不匹配)
SQL 实现
以MySQL/PostgreSQL为例,通过LIKE操作符实现前缀匹配:
MySQL 版本
SELECT * FROM my_database db JOIN foreign_table ft ON -- 全匹配 TRIM(LOWER(db.name)) = TRIM(LOWER(ft.name)) -- 库内字符串是外部字符串的前缀(外部更短) OR TRIM(LOWER(db.name)) LIKE CONCAT(TRIM(LOWER(ft.name)), '%') -- 外部字符串是库内字符串的前缀(库内更短) OR TRIM(LOWER(ft.name)) LIKE CONCAT(TRIM(LOWER(db.name)), '%');
PostgreSQL 版本
用||替代CONCAT:
SELECT * FROM my_database db JOIN foreign_table ft ON TRIM(LOWER(db.name)) = TRIM(LOWER(ft.name)) OR TRIM(LOWER(db.name)) LIKE TRIM(LOWER(ft.name)) || '%' OR TRIM(LOWER(ft.name)) LIKE TRIM(LOWER(db.name)) || '%';
说明
TRIM用于去除字符串首尾空格,LOWER实现大小写不敏感匹配(根据业务需求可移除)- 该查询只会返回符合规则的匹配记录,示例2中的两条数据不会被关联
内容的提问来源于stack exchange,提问作者Mahmoud Khaled Sayed
相关产品推荐
相关产品推荐

