如何用R的stringr包从长向量中提取完整的变量赋值表达式?
问题描述
现有存储在单个长向量中的文本内容如下:
&nuSessao=26.2023 &nuSessao=21.2013.N &nuSessao=24.2023 &Data=22/12/2023 &txFaseSessao=Ordem do Dia &txFaseSessao=Fechamento
需要提取指定变量(如&nuSessao)的所有完整赋值表达式,最终得到如下向量:
[1] "&nuSessao=26.2023" "&nuSessao=21.2013.N" "&nuSessao=24.2023"
尝试使用以下代码:
results<-stringr::str_extract_all(MyPage, "&amp;nuSessao=*") |> unlist()
但结果仅重复返回变量名部分,而非完整表达式:
results [1] "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" [5] "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" [9] "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" [13] "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" [17] "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" [21] "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" [25] "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" [29] "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" [33] "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" [37] "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" [41] "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" [45] "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" "&amp;nuSessao=" [49] "&amp;nuSessao=" "&amp;nuSessao="
解决方法
方法一:修正正则表达式
之前的正则&amp;nuSessao=*中,=后面的*表示匹配0个或多个=,而非匹配变量值。需要修改为匹配=之后直到换行符的所有内容,正确的正则如下:
results <- stringr::str_extract_all(MyPage, "&amp;nuSessao=.+") |> unlist()
如果需要更严谨(比如处理可能的空值或特殊字符),可以使用[^\\n]+匹配换行符之外的所有字符:
results <- stringr::str_extract_all(MyPage, "&amp;nuSessao=[^\\n]+") |> unlist()
方法二:先分割再筛选
如果文本是按换行符分隔的,也可以先将长向量分割为单行元素,再筛选包含目标变量的行:
# 分割为单行 lines <- stringr::str_split(MyPage, "\\n") |> unlist() # 筛选包含目标变量的行 results <- lines[stringr::str_detect(lines, "&amp;nuSessao=")]
这两种方法都能得到预期的完整赋值表达式向量。# 问题
我有一个存储在单个长向量中的文本文件,内容包含如下赋值表达式:
&nuSessao=26.2023 &nuSessao=21.2013.N &nuSessao=24.2023 &Data=22/12/2023 &txFaseSessao=Ordem do Dia &txFaseSessao=Fechamento
我希望提取指定变量的所有完整赋值表达式并保存到向量中,预期结果如下:
[1] "&nuSessao=26.2023" "&nuSessao=21.2013.N" "&nuSessao=24.2023"
尝试使用以下命令后,仅得到重复的变量名部分,而非完整表达式:
results <- stringr::str_extract_all(MyPage, "&nuSessao=*") |> unlist()
返回结果:
results [1] "&nuSessao=" "&nuSessao=" "&nuSessao=" "&nuSessao=" [5] "&nuSessao=" "&nuSessao=" "&nuSessao=" "&nuSessao=" [9] "&nuSessao=" "&nuSessao=" "&nuSessao=" "&nuSessao=" [13] "&nuSessao=" "&nuSessao=" "&nuSessao=" "&nuSessao=" [17] "&nuSessao=" "&nuSessao=" "&nuSessao=" "&nuSessao=" [21] "&nuSessao=" "&nuSessao=" "&nuSessao=" "&nuSessao=" [25] "&nuSessao=" "&nuSessao=" "&nuSessao=" "&nuSessao=" [29] "&nuSessao=" "&nuSessao=" "&nuSessao=" "&nuSessao=" [33] "&nuSessao=" "&nuSessao=" "&nuSessao=" "&nuSessao=" [37] "&nuSessao=" "&nuSessao=" "&nuSessao=" "&nuSessao=" [41] "&nuSessao=" "&nuSessao=" "&nuSessao=" "&nuSessao=" [45] "&nuSessao=" "&nuSessao=" "&nuSessao=" "&nuSessao=" [49] "&nuSessao=" "&nuSessao="
解决方法
错误原因
原正则表达式&nuSessao=*中的*是正则量词,作用是匹配前面的=字符0次或多次,因此只会捕获&nuSessao=部分,无法获取等号后的赋值内容。
方案1:修正正则表达式直接提取
使用[^\\n]+匹配等号后除换行符外的所有字符,确保捕获整行的完整赋值:
library(stringr) # 提取所有以&nuSessao=开头的完整赋值表达式 results <- str_extract_all(MyPage, "&nuSessao=[^\\n]+") |> unlist()
方案2:拆分文本后筛选(更直观)
先将长向量拆分为单行,再筛选以目标变量开头的行:
library(stringr) # 把长文本拆分为单独的行 lines <- str_split(MyPage, "\\n") |> unlist() # 筛选以&nuSessao=开头的行 results <- lines[str_detect(lines, "^&nuSessao=")]
两种方案都能得到预期的完整赋值表达式向量。
内容的提问来源于stack exchange,提问作者RodLL
相关产品推荐
相关产品推荐

