【问题标题】:Extract a word1 between two words A and B在两个单词 A 和 B 之间提取一个 word1
【发布时间】:2021-11-29 01:14:51
【问题描述】:

我想在两个单词 A 和 B 之间提取一个 word1,但我不想在 word1 前后使用空格。而且我不想占用一个新单词 B 的出现。

例子:

library(stringr)
pattern <- "(?<=wA).*(?=wB)"
str1 <- "qzpdjpqz wA    Hello world !                   wB  edjifdjiq"
str2 <- "qzpdjpqz wA    Hello world !                   wB  wB"

str_match_all(str1, pattern)  
str_match_all(str2, pattern)

str11 <- "qzpdjpqz wA    word1                   wB  edjifdjiq\n 


qzpdjpqz wA                    word2                   wB 
wB\n

qzpdjpqz gregegt wA    word3                   wB  wB\n rsgeef vfsfeqz 

wA    word4 wB                 "

期望的结果 -> “Hello world!”

【问题讨论】:

    标签: r regex stringr


    【解决方案1】:

    这是一个基本 R 选项,sub 删除 'wA' 之后和 'wB' 之前的空格。

    str1 <- "qzpdjpqz wA    Hello world !                   wB  edjifdjiq"
    str2 <- "qzpdjpqz wA    Hello world !                   wB  wB"
    
    sub('.*wA\\s+(.*?)\\s+wB.*', '\\1', c(str1, str2)) 
    #[1] "Hello world !" "Hello world !" 
    

    【讨论】:

    • 您好,感谢您的帮助。我忘了说上下文。我使用 pdftools 包从 pdf 中检索一些文本。 pdf是几页,这就是为什么我使用“str_match_all”函数,“sub”函数只检索每页的第一个匹配项,而不是所有匹配项
    • 好吧,str_match_all 中的相同正则表达式似乎可以工作。你试过吗? sapply(str_match_all(c(str1, str2), '.*wA\\s+(.*?)\\s+wB.*'), `[`, 2)
    • 它适用于我创建的示例,但不适用于从 pdf 中提取的内容 :(,它会提取整行。我创建了另一个示例。
    • 我不确定我错过了什么。对于您的新示例,如果我运行代码str_match_all(str11, '.*wA\\s+(.*?)\\s+wB.*')[[1]][, 2],它将返回"word1" "word2" "word3" "word4"。这不是你需要的吗?
    • 您好,它运行良好。感谢您的帮助。
    【解决方案2】:

    如果已知空格的数量,请计算它们。

    stringr::str_match_all(list(str1, str2), '(?<=wA\\s{4}).*(?=\\s{19}wB.+)')
    # [[1]]
    # [,1]           
    # [1,] "Hello world !"
    # 
    # [[2]]
    # [,1]           
    # [1,] "Hello world !"
    

    否则试试regmatches(regexpr())

    sapply(list(str1, str2), \(x) 
           trimws(regmatches(x, regexpr('(?<=wA).*(?=wB.+)', x, perl=TRUE))))
    # [1] "Hello world !" "Hello world !"
    

    【讨论】:

    • 您好,感谢您的帮助,它适用于我创建的示例,但不适用于使用 pdftools 包从 pdf 中提取的真实内容。我创建了另一个可能更接近我所拥有的示例,它是 str11
    猜你喜欢
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2014-08-20
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多