R 从文本文件中提取字符串

R 从文本文件中提取字符串,r,text-mining,R,Text Mining,我想提取文本文件中两个单词(start,end)之间的字符串,但想在第二次出现start-till-end之后开始提取 例如,我的文本是 test.text <- c("During the year new factories at Haridwar for LV apparatus and at Bangalore for LV electric motors commenced production. Further increases in range and LV switchg

我想提取文本文件中两个单词(start,end)之间的字符串,但想在第二次出现start-till-end之后开始提取

例如,我的文本是

test.text <- c("During the year new factories at Haridwar for LV apparatus and at Bangalore for LV electric motors commenced production. Further increases in range and LV switchgear capacity augmentation are planned for  motors, HT motors, Drives and .")

我们可以定位位置,然后执行
substr

library(stringr)
i1 <- str_locate_all(test.text, "LV")[[1]][2,2]+2
i2 <- str_locate(test.text, "capacity")[[1]]-2
sub("\\sLV.*", "", substr(test.text, i1, i2))
#[1] "electric motors commenced production. Further increases in range and"
库(stringr)

i1我们可以定位位置,然后执行
substr

library(stringr)
i1 <- str_locate_all(test.text, "LV")[[1]][2,2]+2
i2 <- str_locate(test.text, "capacity")[[1]]-2
sub("\\sLV.*", "", substr(test.text, i1, i2))
#[1] "electric motors commenced production. Further increases in range and"
库(stringr)

i1带有strsplit的解决方案:

strsplit(test.text, "\\sLV\\s")[[1]][3]    
# [1] "electric motors commenced production. Further increases in range and"

strsplit(test.text, "\\s(LV(?!\\sswitchgear)|capacity)\\s", perl = TRUE)[[1]][3]
# [1] "electric motors commenced production. Further increases in range and LV switchgear"

第一行给出OP的预期输出。第二行给出了我认为OP的真正含义。

一个带有strsplit的解决方案:

strsplit(test.text, "\\sLV\\s")[[1]][3]    
# [1] "electric motors commenced production. Further increases in range and"

strsplit(test.text, "\\s(LV(?!\\sswitchgear)|capacity)\\s", perl = TRUE)[[1]][3]
# [1] "electric motors commenced production. Further increases in range and LV switchgear"

第一行给出OP的预期输出。第二行给出了我认为OP的真正含义。

嗨,欢迎来到SO。你能帮我们翻译一下你正在尝试的代码吗?你说“忽略后面的代码”,但是你的预期输出在“后面的”LV停止,是不是电机开始生产了。范围和低压开关设备的进一步增加。。很抱歉我希望输出直到“低压开关设备”在“容量”之前结束,如:“电机开始生产。进一步增加范围和低压开关设备”。只希望“LV”在第二次出现后被忽略,它不会影响输出流。请在下面的投票按钮上点击灰色格子标记来帮助您获得最大的帮助。你能帮我们翻译一下你正在尝试的代码吗?你说“忽略后面的代码”,但是你的预期输出在“后面的”LV停止,是不是电机开始生产了。范围和低压开关设备的进一步增加。。很抱歉我希望输出直到“低压开关设备”在“容量”之前结束,如:“电机开始生产。进一步增加范围和低压开关设备”。只希望“LV”在第二次出现后被忽略,它不会影响输出流。请考虑通过点击下选按钮上的灰色复选标记来帮助您最多的答案。非常感谢您…它在很大程度上帮助了:)请解释代码的第二行,特别是(\\s?!)符号的使用。我想开始从两个起始词的第二次出现提取到两个结束词的第二次出现。例如cities@JainArihant
\\s
表示空间。与其他语言不同,我们用一条斜杠逃跑非常感谢你。。。它在很大程度上帮助了:)请解释代码的第二行,特别是(\\s?!)符号的使用。我想开始从两个起始词的第二次出现提取到两个结束词的第二次出现。例如cities@JainArihant
\\s
表示空间。与其他语言不同,我们用另一个斜杠来逃避。请解释第二行代码,特别是(\\s?!)符号的使用。我想开始从第二次出现的起始词到第二次出现的结束词。例如cities@JainArihant
\\s
代表空间
(?!\\sswitchgear)
是一个负向前瞻,意思是“不在“开关设备”之前”,因此
(LV(?!\\sswitchgear)
匹配所有“LV”,而不是紧跟在空格和“开关设备”之后。对于新规范,请编辑您的问题或提出新问题。通常不鼓励在注释中添加类似的附加要求。请解释第2行代码,尤其是此(\\s?!)的用法符号。我想从两个起始词中的第二个开始提取到两个结束词中的第二个。例如cities@JainArihant
\\s
代表空格。
(?!\\sswitchgear)
是一个负向前瞻,意思是“不在“开关设备”之前”,因此
(LV(?!\\sswitchgear)
匹配所有“LV”没有紧接着空格和“开关设备”。对于新规范,请编辑您的问题或提出新问题。通常不鼓励在注释中添加类似的附加要求。