【问题标题】:R Regex match the last occuranceR 正则表达式匹配最后一次出现
【发布时间】:2017-06-24 04:47:53
【问题描述】:

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

我有一些文字:

blah blah blah...\n计算尺考试不会引起 症状。\nImPACT 测试日期:...(在学校完成的基线)\n语言 记忆合成\n98\n98%\n视觉记忆合成\n81\n69%\n视觉 电机速度复合?38.83\n70%\n反应时间\n0.59\n56%\n脉冲 控制\n9\n症状总分\n3\nImPACT 测试日期:... (受伤后在学校完成)\n语言记忆复合\n54\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。

【问题讨论】:

  • 尝试[\s\S]*Verbal Memory Composite\n(\S+?)\n(\S+?)\n 正确转义。
  • 您不需要最后一个.*,如果引号全部转义,您还需要转义\\n。如果他们不这样做并且只是限制字符,则分别将其设为\S\n。另外,我会改用\r?\n。\

标签: r regex


【解决方案1】:

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

因此,您只需将\S+? 替换为\S+,即可。

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

".*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+ 个非空白字符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2016-03-18
    相关资源
    最近更新 更多