R正则表达式匹配最后一次出现

时间:2017-06-23 19:09:45

标签: r regex

我尝试了很多东西,但我仍在寻找解决方案......

我有一些文字:

  等等等等......等滑动规则考试不会激怒   症状。\ nImPACT测试日期:...(在学校完成基线)\ nVerbal   内存合成\ n98 \ n98%\ n视觉内存合成\ n81 \ n69%\ n视觉   电机速度复合?38.83 \ n70%\ n反应时间\ n0.59 \ n56%\ nImpulse   控制\ n9 \ n总体症状评分\ n3 \ nImM测试日期:......   (在学校完成伤后)\ nVerbal Memory Composite \ n54 \ n< 1%\ nVisual   记忆合成\ n35 \ n< 1%\ n视觉马达......等等等等等等。

我想捕获该人的最后一个测试分数(就文本中的顺序而言)。现在我正在捕获第一个(在文本中的序列方面)测试分数。

此代码捕获第一个Verbal Memory Composite分数,在本例中为98和98(百分比)。我想捕获最后一个,在这种情况下为54和1(百分比)。

我目前的代码:

re = ".*Verbal Memory Composite\n(\\S+?)\n(\\S+?)\n.*"
concussion.notes$IMPACT_VERBAL_MEM_NEW = as.numeric.score(with(concussion.notes, ifelse(grepl(re,NOTE_TEXT),sub(re,'\\1',NOTE_TEXT),'')))
concussion.notes$IMPACT_VERBAL_MEM_PCT_NEW = as.numeric.score(with(concussion.notes, ifelse(grepl(re,NOTE_TEXT),sub(re,'\\2',NOTE_TEXT),'')))

我尝试了gsub而不是sub,除此之外,还有98.

1 个答案:

答案 0 :(得分:1)

主要问题是你在TRE正则表达式模式中使用了懒惰和贪婪量词的混合。 Henry Spencer以这样的方式编写了他的库,即同一分支中的所有量词都应该具有相同的贪婪。在Tcl实现中,它是第一个设置贪婪的量词,在TRE中,并非总是如此。

因此,您可以将\S+?替换为\S+,这样就可以了。

但是,您将在第2组(<1%)获得\\2。我建议你用

".*Verbal Memory Composite\n[^\n0-9]*(\\d+)\\S*\n[^\n0-9]*(\\d+)\\S*\n.*"

请参阅R online demo

NOTE_TEXT <- "blah blah blah...\nSlide rule exam does not provoke symptoms.\nImPACT Test Date: ... (baseline done at school)\nVerbal Memory Composite\n98\n98%\nVisual Memory Composite\n81\n69%\nVisual Motor Speed Composite?38.83\n70%\nReaction Time\n0.59\n56%\nImpulse Control\n9\nTotal Symptom Score\n3\nImPACT Test Date: ... (post-injury done at school)\nVerbal Memory Composite\n54\n<1%\nVisual Memory Composite\n35\n<1%\nVisual Motor ... blah blah blah"
re = ".*Verbal Memory Composite\n[^\n0-9]*(\\d+)\\S*\n[^\n0-9]*(\\d+)\\S*\n.*"
sub(re,'\\1',NOTE_TEXT)
## => [1] "54"
sub(re,'\\2',NOTE_TEXT)
## => [1] "1"

\S+?替换为[^\n0-9]*(\\d+)\\S*

  • [^\n0-9]* - 除了换行符和数字
  • 之外的零个或多个字符
  • (\\d+) - 第1/2组:一个或多个数字
  • \\S* - 0+非空白字符