我正在考虑从像这样的字符串中提取会计年度月+日期
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]
可以得到我想要的内容,但我想有更简单的方法。
答案 0 :(得分:2)
只需在 TRE 正则表达式模式中匹配任何0 +字符的末尾添加.*
:
sub("^Fiscal year end: ([A-Za-z]+\\s*\\d+);.*","\\1", "Fiscal year end: March 31; reporting period for")
注意我使[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")