【问题标题】:Extract words between the first occurrence two strings in a sentence [closed]提取句子中第一次出现的两个字符串之间的单词[关闭]
【发布时间】:2019-09-23 05:52:53
【问题描述】:

我有以下输入语句:

B <- "ASSIGNEE/BANK (FORMERLY KNOWN AS BANK SETIA) AND NUR AMIRA BINTI RAMZI [NRIC NO. 918267-16-6252] AND HAFIZUDDIN BIN ALI [NRIC NO. 918273-16-1635] ASSIGNOR"

我想提取AND(应包含在输出中)和ASSIGNOR(应从输出中排除)之间的单词。

预期输出

AND NUR AMIRA BINTI RAMZI [NRIC NO. 918267-16-6252] AND HAFIZUDDIN BIN ALI [NRIC NO. 918273-16-1635]".

在assignee 之前和assignor 之后我还有很多话要说。我只想捕获中间的一个,如上图所示。

这是我迄今为止的试验,没有产生所需的输出:

sub(".*ASSIGNEE.* *(AND.*?) *ASSIGNOR.*", "\\1", B)
# [1] "AND HAFIZUDDIN BIN ALI [NRIC NO. 918273-16-1635]"

谢谢。

【问题讨论】:

  • 修改你的代码,应该可以工作。试试sub(".*ASSIGNEE.* *(AND.*?ASSIGNOR).*", "\\1", B)
  • 如何检测first and in sentence?此代码检测最后一个和
  • 我不确定你想得到什么,但如果我没记错的话,试试sub(".*ASSIGNEE.*? *(AND.*?ASSIGNOR).*", "\\1", B)。也就是说,在您的代码中,如果您想包含它,则必须在 ASSIGNOR 之后关闭括号(如我的第一条评论中所示),并且您必须在 ASSIGNEE.* 之后添加 ? 以获得第一个 AND。跨度>

标签: r regex


【解决方案1】:

我认为你可以使用这样的正则表达式:

and{1}.*

这个正则表达式将找到第一个“and”并与之匹配,然后继续直到换行。如果你想要整个字符串,你可以这样做(可能有更好的方法来做到这一点。

and{1}[^]*

您可以在本站测试正则表达式:https://regexr.com/

【讨论】:

  • 我不能使用这条评论它仍然检测到最后一个并且
【解决方案2】:

你可以试试。第一组是你想要得到的。

/^.*?(and.*?)(?=and|$)/i

您可以在本站测试正则表达式:https://regex101.com/r/jNVQLT/1

【讨论】:

    【解决方案3】:

    您可以使用regexec / regmatches 使用基本 R 解决方案提取所需的字符串:

    rx <- "\\b(AND.*?)\\s*ASSIGNOR\\b"
    x <- "ASSIGNEE/BANK (FORMERLY KNOWN AS BANK SETIA) AND NUR AMIRA BINTI RAMZI [NRIC NO. 918267-16-6252] AND HAFIZUDDIN BIN ALI [NRIC NO. 918273-16-1635] ASSIGNOR"
    regmatches(x, regexec(rx, x))[[1]][2]
    ## => [1] "AND NUR AMIRA BINTI RAMZI [NRIC NO. 918267-16-6252] AND HAFIZUDDIN BIN ALI [NRIC NO. 918273-16-1635]"
    

    ASSIGNOR 移到前瞻中的相同正则表达式可以与 PCRE 正则表达式一起使用:

    regmatches(x, regexpr("\\bAND.*?(?=\\s*ASSIGNOR\\b)", x, perl=TRUE))
    # => [1] "AND NUR AMIRA BINTI RAMZI [NRIC NO. 918267-16-6252] AND HAFIZUDDIN BIN ALI [NRIC NO. 918273-16-1635]"
    

    ASSIGNOR 移到前瞻中的相同正则表达式可以与使用ICU 正则表达式库的stringr::str_extract 函数一起使用:

    library(stringr)
    stringr::str_extract(x, "\\bAND.*?(?=\\s*ASSIGNOR\\b)")
    # => [1] "AND NUR AMIRA BINTI RAMZI [NRIC NO. 918267-16-6252] AND HAFIZUDDIN BIN ALI [NRIC NO. 918273-16-1635]"
    

    说明

    • \b - 单词边界
    • (AND.*?) - 捕获组 1:AND,然后尽可能少地捕获任意数量的任何 0+ 字符(在 PCRE 和 ICU 正则表达式中,换行符除外),直到第一次出现
    • \s* - 0+ 个空格
    • ASSIGNOR\b - 整个词ASSIGNOR

    在 PCRE 和 ICU 正则表达式中,不需要捕获括号,(?=...) 是匹配文本但不将其放入匹配项(=不消耗文本)的正向前瞻。

    请参阅regex demo

    【讨论】:

      【解决方案4】:

      使用stringrregex

      library(stringr)
      str_extract(B, regex("(?=AND)(?s)(.*$)"))
      
      # [1] " AND NUR AMIRA BINTI RAMZI [NRIC NO. 918267-16-6252] AND HAFIZUDDIN BIN ALI [NRIC NO. 918273-16-1635] ASSIGNOR"
      

      有关正则表达式参考,请查看Regular Expression Reference: Special Groups

      更新

      如果你想要ANDASSIGNOR之间的单词你可以修改regex如下:

      str_extract(B, regex("(?=AND)(.*?)(?=ASSIGNOR)"))
      
      B <- "ASSIGNEE/BANK (FORMERLY KNOWN AS BANK SETIA) AND ASSIGNOR"
      # "AND "
      
      B <- "ASSIGNEE/BANK (FORMERLY KNOWN AS BANK SETIA) AND The Man in the iron mask other more strings ASSIGNOR"
      #AND The Man in the iron mask other more strings
      
      B <- "ASSIGNEE/BANK (FORMERLY KNOWN AS BANK SETIA) AND NUR AMIRA BINTI RAMZI [NRIC NO. 918267-16-6252] AND HAFIZUDDIN BIN ASSIGNOR ALI [NRIC NO. 918273-16-1635] ASSIGNOR and another ASSIGNOR"
      #"AND NUR AMIRA BINTI RAMZI [NRIC NO. 918267-16-6252] AND HAFIZUDDIN BIN 
      
      B <- "ASSIGNEE/BANK (FORMERLY KNOWN AS BANK SETIA) AND NUR AMIRA BINTI RAMZI [NRIC NO. 918267-16-6252] AND HAFIZUDDIN BIN ALI [NRIC NO. 918273-16-1635] ASSIGNOR and another ASSIGNOR"
      
      #"AND NUR AMIRA BINTI RAMZI [NRIC NO. 918267-16-6252] AND HAFIZUDDIN BIN ALI [NRIC NO. 918273-16-1635] "
      

      现在应该可以了。

      【讨论】:

      • 我不想要assignor这个词。在assignor之后我有很多话。我不想在assignor之后全部提取
      • @Wawa 查看我的更新。
      猜你喜欢
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 2014-02-26
      • 2012-04-13
      • 1970-01-01
      相关资源
      最近更新 更多