我尝试了很多东西,但我仍在寻找解决方案......
我有一些文字:
等等等等......等滑动规则考试不会激怒 症状。\ 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.
答案 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+非空白字符