如何从.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
相关产品推荐
相关产品推荐

