如果找到某些关键字,则提取日期

时间:2018-10-28 13:38:24

标签: r regex string

我有一段大段文字,例如:

mytext <- "Date joined: some long text here 01/02/2012. Some more long text here, then commencement date: 1/5/2012. More info at the end."

我想提取任何包含“加入日期”或“开始日期”的句子中的所有日期

所以我的结果将是1/5/2012和01/02/2012。

我用正则表达式尝试了几种模式,但到目前为止还没有成功。

1 个答案:

答案 0 :(得分:1)

这是您提供的原始文本:

public class Set implements Iterable<Integer> {

  private LinkedList<Integer> elements;

  public Set() {
    this.elements = new LinkedList<Integer>();
  }

  @Override
  public Iterator<Integer> iterator() {
    return elements.iterator();
  }
}

首先在句点处分割文本,然后返回句子的向量。

mytext <- "Date joined: some long text here 01/02/2012. Some more long text here, then commencement date: 1/5/2012. More info at the end."

然后,我们仅选择带有您注意到的短语的那些句子。

sentences <- strsplit(mytext,".",fixed=TRUE)[[1]]

现在我们可以搜索日期:

relevant <- sentences[grepl("Date joined|commencement date",sentences)]

这将产生向量:

unlist(regmatches(relevant,gregexpr("[0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4}",relevant)))

取决于日期格式的变化范围,您可能必须调整此正则表达式模式。另外,我精确地使用了您提供的短语(大写)来选择句子。如果这些短语不区分大小写,那么在选择包含这些短语的句子时,您将希望使用[1] "01/02/2012" "1/5/2012" 选项。

更新:原始海报询问如何提取每个相关句子中的第一个日期。我修改了代码以提供这种情况的相关示例并使用sapply。

ignore.case=TRUE

mytext <- "Date joined: some long text here 01/02/2012 and also here 05/13/1899. Some more long text here, then commencement date: 1/5/2012 and also 2/3/4567. More info at the end." sentences <- strsplit(mytext,".",fixed=TRUE)[[1]] relevant <- sentences[grepl("Date joined|commencement date",sentences)] the_dates <- regmatches(relevant,gregexpr("[0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4}",relevant)) the_first_dates <- sapply(the_dates,function(z) z[1]) 中,我们有了

the_first_dates