我有
String=“Text1.Text2(er2019).Text3(246)text.”
所需的输出:
String=“Text2.Text3”
我只想提取Text2
,Text3
,-第2个元素和第3rx个元素中(
左侧的所有内容。我对第一个元素Text1
不感兴趣。
答案 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 = "")
str_extract_all
包中的stringr
,我们提取了.
和(
之间的所有文本。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组的模式。