2014-12-15 5 views
2

Мое регулярное выражение похоже, что оно должно работать, но возвращает неожиданные результаты.regex для времени захвата, не получая две цифры перед двоеточием, только один

Я использую 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 AM, 3:04 AM) препарат был получен из некоторых бесплатных текстовых заметок.

Я получаю 3:04 утра, но в 10:47 утра я получаю 0:47 утра вместо этого. Сейчас я попробовал несколько разных вещей и по какой-то причине не могу получить эту первую цифру. Любые идеи, что я делаю неправильно?

+4

Просьба привести несколько примеров вместе с ожидаемым выходом. –

+0

Я бы '[AP] M', а не' [APM] {2} ', чтобы избежать ложных совпадений (AA) –

ответ

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" 
+0

Это тоже работает! – soporific

4

.* в начале жадный, поэтому .*\\s* соответствует всем, вплоть до первой цифры времени (самое длинное, что может потребоваться и по-прежнему найти совпадение). Вместо этого используйте [^\\d]*\\s*.

+0

Спасибо, это сработало! – soporific

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})))" 

И PICTO-объяснение комплименты https://www.debuggex.com:

enter image description here