R语言sub正则匹配异常:街道地址提取结果不符问题排查
问题原因及解决方法
你的问题出在两个关键点上:
1. base R的sub默认不支持非捕获组语法
你写的正则里用了(?:...)这种非捕获组写法,但base R的sub函数默认采用POSIX基本正则表达式(BRE),这种语法不识别(?:...),会把它当成普通字符((、?、:这些符号)解析,导致正则完全偏离预期,错误匹配了更多内容,最终得到"1843"。
2. 正则缺少单词边界限制(次要原因)
就算忽略语法问题,你的正则没有给关键词加单词边界(\b),再加上\s*的贪婪匹配特性,也可能导致误匹配到包含关键词子串的内容,不过你的情况主要是第一个原因导致的。
解决方法
你可以任选以下一种方式修复:
启用PCRE模式:在
sub里加上perl=TRUE参数,让它支持非捕获组语法:sub("\\s*(?:#|SUITE|STE|APT|UNIT|FL|RM|BUILDING|BLDG|SPACES|SPC)\\s*[^\\s]+.*$", "", "1843 FLOYD ST STE 100", perl=TRUE)改用BRE支持的捕获组:把非捕获组的
?:去掉,换成普通的捕获组(BRE支持这种写法):sub("\\s*(#|SUITE|STE|APT|UNIT|FL|RM|BUILDING|BLDG|SPACES|SPC)\\s*[^\\s]+.*$", "", "1843 FLOYD ST STE 100")添加单词边界更严谨:给关键词加上
\b确保只匹配独立的单词,避免后续出现类似误匹配:sub("\\s*\\b(?:#|SUITE|STE|APT|UNIT|FL|RM|BUILDING|BLDG|SPACES|SPC)\\b\\s*[^\\s]+.*$", "", "1843 FLOYD ST STE 100", perl=TRUE)
以上三种方法都能得到你预期的结果:1843 FLOYD ST。
内容的提问来源于stack exchange,提问作者Charles Knell
相关产品推荐
相关产品推荐

