如何使用Power Query从自由格式字符串中提取州信息
解决自由输入地址中的州信息提取问题
问题核心
你当前用Text.Contains的方式是子字符串匹配,会误命中单词中的片段(比如Calumet里的Ca被识别为CA),必须改成匹配完整的州标识符——利用地址里州信息的常见格式规律(通常跟在逗号后、处于单词边界,支持全称、带点/不带点的缩写)。
解决方案:用正则匹配完整州标识
在Power Query的M语言里,用Text.MatchesRegex结合正则表达式的单词边界(\b)来确保只匹配独立的州缩写/全称,同时忽略大小写差异。
完整代码示例
替换你原来的Table.AddColumn逻辑,以下是支持多州匹配的通用模板(以CA、SC为例,可扩展到所有州):
= Table.AddColumn(#"Changed Type", "Extract_State", each let // 统一转成大写,避免大小写干扰 Address_Upper = Text.Upper([#"Business Information | Business Address"]), // 定义州匹配规则:每个规则是正则表达式,\b表示单词边界 State_Rules = [ CA = "\bCA\b|\bCALIFORNIA\b", SC = "\bSC\b|\bS\.C\.\b|\bSOUTH CAROLINA\b" // 在这里添加其他州的匹配规则,格式同上 ], // 遍历规则,找到第一个匹配的州代码 Matched_State = List.First(List.Select(Record.FieldNames(State_Rules), each Text.MatchesRegex(Address_Upper, State_Rules(_)))) in // 如果没匹配到返回空值,可根据需求改成其他默认值 if Matched_State <> null then Matched_State else null)
代码关键点说明
Text.Upper:把地址转成大写,统一匹配规则,不用考虑用户输入的大小写(比如ca、Ca都能匹配)。- 正则
\b:单词边界,确保CA只会匹配独立的缩写,不会命中Calumet里的CA片段。 - 多格式支持:比如南卡罗来纳州的规则包含了
SC、S.C.、SOUTH CAROLINA三种常见格式,覆盖用户的自由输入情况。 List.First+List.Select:遍历所有州规则,返回第一个匹配到的州代码(正常地址只会有一个州,所以取第一个即可)。
进阶优化:处理逗号后的州
很多地址里州会跟在城市名后的逗号后面,也可以针对这种常见场景优化正则,比如匹配,\s*CA\b(逗号+空格+州缩写),进一步减少误判:
// 以CA为例,优化后的正则规则 CA = "\bCA\b|\bCALIFORNIA\b|,\s*CA\b|,\s*CALIFORNIA\b"
内容的提问来源于stack exchange,提问作者J.Price
相关产品推荐
相关产品推荐

