2

我的正则表达式似乎应该可以工作,但是却返回了意外的结果。

我正在使用 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 AM 就好了,但是对于 10:47 AM,我得到了 0:47 AM。我现在已经尝试了很多不同的东西,但由于某种原因无法让第一个数字过来。任何想法我做错了什么?

4

3 回答 3

4

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

于 2014-12-15T16:36:57.977 回答
4

这是rm_time我维护qdapRegex (>= v. 0.2.0) 的包中使用的一种方法:

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的图片解释恭维:

在此处输入图像描述

于 2014-12-15T16:37:38.010 回答
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" 
于 2014-12-15T16:41:41.200 回答