【问题标题】:Extract string from text file从文本文件中提取字符串
【发布时间】:2017-10-06 05:05:27
【问题描述】:

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

比如我的文字是

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 .")

我需要在第二个“LV”之后开始提取文本(忽略后面的那个)(不区分大小写)直到“容量”。

输出应该是这样的:

electric motors commenced production. Further increases in range and

【问题讨论】:

  • 嗨,欢迎来到 SO。您能帮我们解决您正在尝试的代码吗?
  • 你说“忽略后面的那个”,但是你预期的输出停在“后面那个”的LV,不应该是electric motors commenced production. Further increases in range and LV switchgear吗?
  • 哦..对不起。我希望在“容量”之前输出直到“低压开关设备”结束:“电动机开始生产。范围和低压开关设备的进一步增加”。只是希望“LV”在第二次出现后被忽略,它不应该影响输出流。
  • 考虑接受对您帮助最大的答案,方法是单击“否决”按钮下方的灰色复选标记。

标签: r text-mining


【解决方案1】:

我们可以定位到位置,然后执行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"

【讨论】:

  • 非常感谢...帮助很大:)
  • 请解释第二行代码,特别是这个 (\\s ?! ) 符号的使用。我想从第 2 次出现的起始词到第 2 次出现的结束词开始提取.例如,城市
  • @JainArihant \\s 表示空间。与其他语言不同,我们用一个斜线转义
【解决方案2】:

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 的真正含义。

【讨论】:

  • 请解释第二行代码,特别是这个 (\\s ?! ) 符号的使用。我想从第 2 次出现的起始词到第 2 次出现的结束词开始提取.例如,城市
  • @JainArihant \\s 代表空间。 (?!\\sswitchgear) 是负前瞻,意思是“不在“switchgear”之前”,所以(LV(?!\\sswitchgear) 匹配所有“LV”,而不是紧跟空格和“switchgear”。对于新规范,请编辑您的问题或提出新问题。通常不鼓励在 cmets 中添加类似的额外要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
相关资源
最近更新 更多