R语言提取dataframe列中指定字符串片段的实现方法
正则匹配失败原因
你写的(?<=water, )(\\w+)返回NA有两个核心问题:
- 预查片段里
water,后面多写了一个空格,原字符串中逗号后直接跟<strong>标签,没有空格,边界定位本身就失效 \\w规则仅能匹配字母、数字、下划线,无法覆盖目标内容里的空格、括号、冒号这类特殊字符,同时也没有设置匹配终止边界,根本捕获不到完整的目标片段
可直接运行的解决方案
不需要分两次截断字符串,单次正则匹配就能直接提取目标内容:
- 场景1:所有单元格目标内容都被
<strong>标签包裹,用下面的代码可以直接提取纯文本,自动过滤标签:
# 已加载stringr包可跳过第一行 library(stringr) df$Column1 <- str_extract( df$Column1, "(?<=water,<strong>).*?(?=</strong>,salinity)" )
- 场景2:部分单元格没有
<strong>标签,用通用兼容写法提取后,再统一清除可能残留的标签即可:
df$Column1 <- str_extract( df$Column1, "(?<=water,).*?(?=,salinity)" ) # 清除所有可能残留的strong标签 df$Column1 <- str_replace_all(df$Column1, "</?strong>", "")
正则规则说明
(?<=water,<strong>):正向零宽断言,定位到water,<strong>片段的结束位置,本身不会占用匹配字符.*?:非贪婪模式匹配任意字符(支持空格、括号、特殊符号),匹配到下一个边界就立刻停止,不会误抓后面的盐度、经纬度等其他字段(?=</strong>,salinity):正向零宽断言,定位到</strong>,salinity片段的起始位置,作为匹配的终止边界
内容的提问来源于stack exchange,提问作者locopoko
相关产品推荐
相关产品推荐

