如何用R提取括号左侧的文本?

时间:2019-02-23 08:01:35

标签: r regex

我有

String=“Text1.Text2(er2019).Text3(246)text.”

所需的输出:

String=“Text2.Text3”

我只想提取Text2Text3,-第2个元素和第3rx个元素中(左侧的所有内容。我对第一个元素Text1不感兴趣。

2 个答案:

答案 0 :(得分:1)

library(stringr)
String <- 'Text1.Text2(er2019).Text3(246)text.'
Matches <- str_extract_all(string = String, pattern =  "\\.[^()]+\\(")[[1]]
Matches <- str_replace_all(string = Matches, pattern = "^\\.|\\($", replacement = "")
  1. 使用str_extract_all包中的stringr,我们提取了.(之间的所有文本。
  2. 使用str_replace_all,从提取的匹配项中删除每个前导.和每个尾随(

要获得所需的输出,您可以粘贴所有提取的与.折叠的匹配项,如下所示:

paste(Matches, collapse = ".")

答案 1 :(得分:-2)

str = 'Text1.Text2(er2019).Text3(246)text.'
pat = '.*?\\.(.*?)\\(.*?\\)\\.(.*?)\\(.*'
substr =  '\\1\\.\\2'
sub(pat, substr, str)

我发现此问题的方法是转到regex101.com并反复试验直到获得结果。在regex101上,我发现此模式.*?\.(.*?)\(.*?\)\.(.*?)\(.*提供了所需的结果,但是由于R将\视为特殊字符,因此每个\都变为\\

您要舍弃直到第一个句点(包括第一句)的所有文本。 因此,所有这些文本均由.*?\\.捕获。 ?使该模式停止在第一个匹配项上,而不是最后一个匹配项(称为 lazy 匹配项)。

然后,我们要在第一个句点之后保留文本,直到第一个((.*?)\\(.(之间的文本分配给组1。将()放在模式周围会创建一个capturing group,您可以用它来替代。

然后我们丢弃括号\\(.*?\\)\\.中的文本。然后我们重复第2组的模式。