如何使用str_extract提取两个单词之间的文本?

时间:2019-10-07 00:46:45

标签: r regex string

我正在尝试提取两个固定字符串之间的字符串。具体来说,我希望在“地址:”和“此授权”之间的字符串跨越多行。这是一个示例:

Address:
The PowerPool Corp                                                  
1434 Holyfried Route, Unit A                                                 
Melope, VA 21151

This grant is issued

我尝试了以下代码,但是它不起作用:

str_extract(test_case, "(?<=Address:\n)[^\\n]+")

输出

[1] "The PowerPool Corp"

如何获取地址的所有三行?

4 个答案:

答案 0 :(得分:2)

在基数R中使用sub似乎可以正常工作:

cat(sub("Address:(.*)This grant.*", "\\1", test_case))

#The PowerPool Corp                                                  
#1434 Holyfried Route, Unit A                                                 
#Melope, VA 21151

使用cat以格式化的方式显示输出。

数据

test_case <- "Address:
The PowerPool Corp                                                  
1434 Holyfried Route, Unit A                                                 
Melope, VA 21151

This grant is issued"

答案 1 :(得分:2)

您可以通过先匹配Address:来获得不带dotall模式的匹配,然后在组1中捕获所有以“ This grant”开头的行。

JTextPane textPane = new JTextPane(document);
textPane.setEditable(true);

Element elememt = doc.getCharacterElement(docOffset);
if (StyleConstants.isSuperscript(element.getAttributes())) { ...

部分

  • Address:\r?\n((?:(?!This grant\b).*(?:\r?\n|$))*) 匹配地址:和换行符
  • Address:\r?\n捕获第1组
    • (非捕获组
      • (?:如果右边直接不是“ This grant”,则匹配整行
      • (?!This grant\b).*匹配换行符或断言字符串的结尾
    • (?:\r?\n|$)关闭非捕获组并重复以获取所有行
  • )*

例如

)

输出

library(stringr)
test_case <- "Address:
The PowerPool Corp
1434 Holyfried Route, Unit A
Melope, VA 21151

This grant is issued"

str_match(test_case, "Address:\\r?\\n((?:(?!This grant\\b).*(?:\\r?\\n|$))*)")[,2]

Regex demo | R demo

答案 2 :(得分:0)

This answer简单又好,以防万一,我们可能有多个地址,

Address:\\s*(.*?)\\s*This grant\\b

,也可以选择替换\\1

Demo

答案 3 :(得分:0)

str_extract中,.不会匹配行终止符(\n),除非您告知。将regex 修饰符函数与参数dotall = T配合使用以匹配多行。请注意,我还通过删除[^\\n]+并添加.*以及(?=\n\nThis grant)之后的后缀来修正您的正则表达式:

str_extract(test_case,
            regex("(?<=Address:\n).*(?=\n\nThis grant)",
                  dotall = T
                  )
            )

# [1] "The PowerPool Corp\n1434 Holyfried Route, Unit A\nMelope, VA 21151"

也许还有更简单/更快的方式来处理此问题。例如,如果您知道第一行到最后一行总是垃圾,则可以在\n处拆分,然后选择相关行或删除不相关的行,即str_split(test_case, "\n")[[1]][2:4]str_split(test_case, "\n")[[1]][-c(1, 5, 6)]