You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从.sql文件提取城市数据并在Python中实现城市匹配查询?

Hey,这个需求很清晰,我来给你捋捋实现步骤,代码都给你写好啦!

第一步:从SQL文件提取城市数据

首先咱们得把.sql文件里的城市数据捞出来。因为你的SQL文件里是已经执行完成的,应该包含类似INSERT INTO your_table (id, city_name, state, country) VALUES (...);这样的语句。咱们可以用正则表达式来匹配这些数据元组,然后整理成干净的字典列表。

要注意哦,示例数据里的'Tuscaloosa '、'Alabama '都有 trailing space,所以提取后一定要用strip()去掉前后空格,不然匹配的时候会踩坑!

第二步:文本匹配逻辑实现

接下来就是判断输入字符串里有没有包含咱们提取到的城市名了。这里要考虑几个点:

  • 大小写不敏感:比如输入是I live in chicago,也能匹配到Chicago
  • 多词城市名:比如New York,输入里有I'm from New York也要能匹配到
  • 避免部分匹配:比如别把Chicago当成包含Chi的城市(当然如果你的城市列表里有Chi另说,这里默认咱们要匹配完整的城市名)

所以咱们可以先把所有城市名整理成一个列表,然后遍历这个列表,检查城市名是否是输入文本的子串(忽略大小写)。如果匹配到,就返回对应的州和国家信息。

完整代码示例
import re

def load_city_data(sql_file_path):
    city_list = []
    # 读取SQL文件内容
    with open(sql_file_path, 'r', encoding='utf-8') as f:
        sql_content = f.read()
    
    # 匹配INSERT语句里的VALUES部分,正则表达式可以根据你的SQL格式调整
    # 匹配类似 (257, 'Tuscaloosa ', 'Alabama ', 'United States') 的元组
    pattern = r'\((\d+),\s*\'([^\']+)\',\s*\'([^\']+)\',\s*\'([^\']+)\'\)'
    matches = re.findall(pattern, sql_content)
    
    for match in matches:
        city_id, city_name, state, country = match
        # 清理前后空格
        clean_city = city_name.strip()
        clean_state = state.strip()
        clean_country = country.strip()
        city_list.append({
            'city': clean_city,
            'state': clean_state,
            'country': clean_country
        })
    return city_list

def find_city_in_text(input_text, city_data):
    # 把输入文本转成小写,方便不区分大小写匹配
    text_lower = input_text.lower()
    matches = []
    for city_item in city_data:
        city_lower = city_item['city'].lower()
        # 检查城市名是否在文本中(子串匹配)
        if city_lower in text_lower:
            matches.append({
                'city': city_item['city'],
                'state': city_item['state'],
                'country': city_item['country']
            })
    return matches

# 使用示例
if __name__ == '__main__':
    # 替换成你的SQL文件路径
    sql_path = 'your_cities.sql'
    cities = load_city_data(sql_path)
    input_str = 'I live in Chicago'
    result = find_city_in_text(input_str, cities)
    if result:
        print("匹配到的城市信息:")
        for item in result:
            print(f"城市:{item['city']},州:{item['state']},国家:{item['country']}")
    else:
        print("没有匹配到任何城市")
一些需要注意的细节
  • 如果你的SQL文件格式和示例不太一样,比如用双引号或者没有空格,需要调整正则表达式的pattern来适配
  • 如果担心部分匹配的问题(比如文本里有Chicago Heights但你只想匹配Chicago),可以考虑用单词边界匹配,把判断条件改成re.search(rf'\b{re.escape(city_lower)}\b', text_lower),这样只会匹配完整的单词
  • 要是城市数据量很大,建议把城市名放到一个集合里(或者用Trie树)来优化匹配速度,不过一般中小规模的数据用遍历就足够了

内容的提问来源于stack exchange,提问作者Deba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:28:16