PDF数据提取:如何用ifelse语句匹配大小写车型的美元金额
解决车型大小写不一致的价格提取问题
嘿,我完全懂你的困扰——车型名称一会儿大写一会儿小写,确实会让正则匹配直接失效,不用发愁,咱们来一步步解决它!
问题根源
你当前的代码Model <- as.numeric(str_match(f[1], "\\$(\\d+)\\s\\Ford|ford"))[[2]]其实有个小问题:\\Ford|ford的写法并没有正确绑定“前面的价格+空格+车型”这个完整匹配逻辑,而且这种写法很容易漏匹配不同大小写的场景。
方案1:用正则不区分大小写修饰符(最简洁高效)
在R的正则规则里,你可以用(?i)开启不区分大小写模式,这样不管车型是Ford、ford还是FORD,都能精准匹配对应的价格,根本不需要ifelse!
示例代码:
library(stringr) # 测试文本,包含大小写不同的Ford f <- "$1500 Chevy $2800 Ford $1200 Subaru $3000 ford" # 提取第一个匹配到的Ford/ford对应的价格 ford_price <- as.numeric(str_match(f, "(?i)\\$(\\d+)\\sFord")[[2]]) print(ford_price) # 输出:2800 # 如果要提取所有Ford/ford的价格,用str_match_all all_ford_prices <- as.numeric(str_match_all(f, "(?i)\\$(\\d+)\\sFord")[[1]][,2]) print(all_ford_prices) # 输出所有匹配项:[2800, 3000]
方案2:用ifelse手动判断(如果你坚持要用的话)
要是你想通过ifelse来处理两种大小写情况,可以分别匹配大写和小写的车型,再用ifelse判断哪个有有效结果:
library(stringr) f <- "$1500 Chevy $2800 ford $1200 Subaru" # 分别匹配大写和小写的Ford match_upper <- str_match(f, "\\$(\\d+)\\sFord")[[2]] match_lower <- str_match(f, "\\$(\\d+)\\sford")[[2]] # 用ifelse选择非NA的结果 ford_price <- as.numeric(ifelse(is.na(match_upper), match_lower, match_upper)) print(ford_price) # 输出:2800
小提醒
如果你的PDF提取文本里还有更多车型(比如Chevy、Subaru),也可以用同样的方法处理——给每个车型的正则加上(?i)修饰符,就能轻松应对各种大小写问题啦!
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

