如何在没有句子的其余部分的情况下仅提取匹配组?

时间:2016-10-16 21:06:58

标签: r regex

我正在考虑从像这样的字符串中提取会计年度月+日期

Fiscal year end: September 30; reporting period for blablablabla
Fiscal year end: March 31; reporting period for blablablabla

正如您所看到的,所有字符串都以Fiscal year end,冒号,空格,月份,空格,月份日期,半冒号和无用文本开头

我的正则表达式:

sub("^Fiscal year end: ([A-Za-z]*?\\s\\d*);","\\1", "Fiscal year end: March 31; reporting period for")

结果:

[1] "March 31 reporting period for"

我的期望:3月31日(因为我指定了一个匹配组)。我猜其余部分不匹配,因此未经修改,但是只有匹配组的干净方式是什么?

我找到了一个使用stringr的解决方法:

str_match("Fiscal year end: March 31; reporting period for", "^Fiscal year end: ([A-Za-z]*?\\s\\d*);")

给出一个矩阵,其中一个元素是匹配组:

     [,1]                         [,2]      
[1,] "Fiscal year end: March 31;" "March 31"

因此从结果中取出[1,2]可以得到我想要的内容,但我想有更简单的方法。

3 个答案:

答案 0 :(得分:2)

只需在 TRE 正则表达式模式中匹配任何0 +字符的末尾添加.*

sub("^Fiscal year end: ([A-Za-z]+\\s*\\d+);.*","\\1", "Fiscal year end: March 31; reporting period for")

请参阅online R demo

注意我使[A-Za-z]+模式贪婪(看起来更自然,因为无论如何会有一些字母)并在其后添加+量词,并\d匹配1个或多个字符(这些在你的场景中似乎是必须的)。

模式详情

  • ^ - 字符串开头
  • Fiscal year end: - 一系列文字字符
  • ([A-Za-z]+\\s*\\d+) - 第1组捕获
    • [A-Za-z]+ - 一个或多个字母
    • \\s* - 0+ whitespaces
    • \\d+ - 1+位数
  • ; - 分号
  • .* - 任意0个字符,包括换行符号,直到字符串结束。

答案 1 :(得分:1)

您可以将字符串解析为Date,然后使用format选择相关部分:

format(as.Date(x, format = "Fiscal year end: %B %d"), "%B %d") 
# [1] "September 30" "March 31"

format的{​​{1}}参数中,您不仅可以包含转换规范(由as.Date引入),还可以包含其他字符;请参阅%的详细信息部分:

  

[a]格式字符串中的ny字符不是转换规范的一部分,按字面解释。

...和

  

每个输入字符串都会根据指定的格式进行处理:忽略任何尾随字符。

但请注意?strptime中的注意

  

如果日期字符串未完全指定日期,则返回的答案可能是系统特定的。最常见的行为是假设缺少的年,月或日是当前的。如果它错误地指定了日期,则可靠的实现将给出错误,并且日期报告为?as.Date

NA

答案 2 :(得分:0)

鉴于你的字符串'图案:

  

正如您所看到的,所有字符串都以Fiscal year end,冒号,空格,月份,空格,月份日期,半冒号和无用文本开头

你也可以这样做:

sub(";.*$","", sub("Fiscal year end: ", "", str))

#[1] "September 30" "March 31"
str <- c("Fiscal year end: September 30; reporting period for blablablabla", 
       "Fiscal year end: March 31; reporting period for blablablabla")