正则表达式用于捕获冒号之前没有两位数的时间,只有一个

时间:2014-12-15 16:30:44

标签: regex r grepl

我的正则表达式看起来应该可以正常工作,但会返回意想不到的结果。

我正在使用R.如果你不使用那些不用担心,我认为这与其他一些正则表达式很相似。和R文档说{n,m}语法应该有效:" {n,m} 前面的项目至少匹配n次,但不超过m次。"

re <- ".*\\s*(\\d{1,2}:\\d{2}\\s*[APM]{2})\\s*\\s*([Aa]lbuterol|[Pp]rednison).*(per order[s]*)\\s*.*"

我想抓住时间(例如上午10:47,凌晨3点04分)从一些免费文本笔记中提取药物。

我上午3:04就好了,但是上午10:47我早上0:47而不是。我现在尝试了很多不同的东西,并且出于某种原因无法获得第一个数字。我有什么想法吗?

3 个答案:

答案 0 :(得分:4)

开头的.*是贪婪的,所以.*\\s*匹配所有内容,包括时间的第一个数字(最长的数字,仍然可以找到匹配项)。请改用[^\\d]*\\s*

答案 1 :(得分:4)

以下是使用我保持 qdapRegex (&gt; = v.0.2.0)的软件包中rm_time的方法:

x <- "I'm getting 3:04 AM just fine, but for 10:47 AM I'm getting 0:47 AM instead."

library(qdapRegex)
rm_default(x, extract=TRUE, pat = "@rm_time2")
[1] "3:04 AM"  "10:47 AM" "0:47 AM"

如果要查看场景背后的正则表达式,请使用带有函数名称的grab函数:

grab("@rm_time2")
## [1] "(\\d{0,2}:\\d{2}(?:[:.]\\d+)?)(\\s+(([AP]\\.{0,1}M\\.{0,1})|([ap]\\.{0,1}m\\.{0,1})))"

https://www.debuggex.com的图片解释赞美:

enter image description here

答案 2 :(得分:2)

如果您使第一个\\s*非贪婪,即\\s*?,则会有效。

vec <- c("some text 10:47 AM text", "another text 3:04 AM text")
sub(".*\\s*?(\\d{1,2}:\\d{2}\\s*[APM]{2})\\s*.*", "\\1", vec)
# [1] "10:47 AM" "3:04 AM"