R语言:如何从带后缀的字符串中提取双词城市名?
提取带数字方位后缀的多词城市名解决方案
嘿,这个场景我太熟悉了!针对这种"城市名 + 数字 + 方位缩写"格式的字符串,正则表达式绝对是最高效的解决方案,完美覆盖单词、双词甚至多词的城市名提取需求。
核心思路
观察你的示例字符串:Stovepipe Wells 1 SW、La Junta 17 WSW,它们的共同模式是:
- 开头是一个或多个首字母大写的单词(城市名,可能是1个、2个甚至更多)
- 后面跟着数字 + 方位缩写(SW、WSW、N等)
我们只需要匹配开头的连续大写首字母单词组,就能精准提取城市名。
具体实现方案
1. Python代码示例
用正则捕获组直接提取目标内容:
import re # 编译正则表达式,支持单/多词城市名 city_regex = re.compile(r'^([A-Z][a-z]+(?:\s[A-Z][a-z]+)*)') # 测试你的示例数据 test_strings = [ "Stovepipe Wells 1 SW", "La Junta 17 WSW", "San Francisco 2 NE", "Boston 8 NW" ] for s in test_strings: match_result = city_regex.match(s) if match_result: print(f"提取到的城市名:{match_result.group(1)}")
运行后输出:
提取到的城市名:Stovepipe Wells 提取到的城市名:La Junta 提取到的城市名:San Francisco 提取到的城市名:Boston
2. SQL数据库直接处理
如果需要在数据库层面直接提取,不同数据库的正则函数略有不同:
- PostgreSQL:
SELECT regexp_match(city_column, '^([A-Z][a-z]+(?:\s[A-Z][a-z]+)*)')[1] AS extracted_city FROM your_table;
- MySQL 8.0+:
SELECT REGEXP_SUBSTR(city_column, '^[A-Z][a-z]+(?:\\s[A-Z][a-z]+)*') AS extracted_city FROM your_table;
正则表达式解释
^([A-Z][a-z]+(?:\s[A-Z][a-z]+)*) 各部分含义:
^:匹配字符串的起始位置,确保我们从开头提取[A-Z][a-z]+:匹配一个首字母大写、后续小写的单词(符合英语地名的命名习惯)(?:\s[A-Z][a-z]+)*:非捕获组,匹配"空格+大写首字母单词"的组合,*表示可以重复0次或多次(这样就支持单词、双词、多词城市名)- 整个括号内的内容就是我们要提取的城市名
注意事项
如果你的城市名存在特殊情况(比如包含连字符、缩写等),可以根据实际情况微调正则。比如如果有Fort Worth-2 3 S这类格式,可以把正则里的[a-z]+改成[a-z-]+来兼容连字符。
内容的提问来源于stack exchange,提问作者thiagoveloso
相关产品推荐
相关产品推荐

