2

私の正規表現は機能するはずですが、予期しない結果を返しています。

私は R を使用しています。これらを使用しない場合でも、心配する必要はありません。これは、他のフレーバーの正規表現とかなり似ていると思います。R のドキュメントには、{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 時 4 分) を取得したいと考えています。

午前 3:04 は問題なく表示されますが、午前 10:47 の場合は代わりに午前 0:47 になります。私はかなりの数の異なることを試しましたが、何らかの理由でその最初の数字を取得できません。私が間違っていることはありますか?

4

3 に答える 3

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 に答える
4

先頭の.*は貪欲なので.*\\s*、時刻の最初の桁までのすべてに一致します (一致を見つけることができる最長の時間)。[^\\d]*\\s*代わりに使用してください。

于 2014-12-15T16:36:57.977 に答える
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 に答える