首页 > 解决方案 > 什么正则表达式可以让我在单词之前或之后找到最接近单词的数字

问题描述

我有如下句子

"There is a 10cm length of Barrett's"
"The length of Barrett's is around 5 cm"
"The Barrett's measures 10cm in length above a 4cm hiatus hernia"
"The length of Barrett's is 5cm but the length of the dysplasia is 3cm"

我想提取 Barrett 的长度作为 ifelse 语句的一部分

    ifelse(grepl("(\\.|^)(?=[^\\.]*cm)(?=[^\\.]*Barr)(?=[^\\.]*(of |length))[^\\.]*(\\.|$)", 
dataframe[,EndoReportColumn], perl=TRUE,ignore.case = TRUE),
stringr::str_extract(stringr::str_match(dataframe[,EndoReportColumn],"(\\.|^)(?=[^\\.]*cm)(?=[^\\.]*[Bb]arr)[^\\.]*(\\.|$)"),"\\d"),"None Found")

我遇到的问题是,如果句子中有两个数字,则提取的数字不正确,因此我得到的句子结果是:

10
5
4
3

如何在包含单词长度和巴雷特的任何顺序的句子中获得最接近(在之前或之后)单词巴雷特的数字?

标签: rregex

解决方案


试试这个正则表达式:

(\d+\s*\w+)[^\d\r\n]*Barret|[^\d\r\n]*Barret[^\d\r\n]*(\d+\s*\w+)

点击演示

通过一些编程,您可以提取 Group 1/2 的内容。

注意: 此解决方案旨在保留提供的示例字符串。\另外,每个人都逃脱\

(\\d+\\s*\\w+)[^\\d\\r\\n]*Barret|[^\\d\\r\\n]*Barret[^\\d\\r\\n]*(\\d+\\s*\\w+)

解释:

  • (\d+\s*\w+)- 匹配 1+ 个数字,后跟 0+ 个空格,后跟 1+ 个单词字符,以匹配并捕获长度及其在组 1中的单位
  • [^\d\r\n]*Barret- 匹配 0+ 次出现的任何既不是换行符也不是回车符也不是数字后跟单词的字符Barret
  • |- 或者
  • [^\d\r\n]*Barret[^\d\r\n]*- 匹配 0+ 次出现的任何字符,该字符既不是换行符也不是回车符,也不是单词后跟的数字Barret。这之后再次出现 0+ 次出现的任何字符,这些字符既不是换行符也不是回车符,也不是后跟单词的数字Barret
  • (\d+\s*\w+)- 匹配 1+ 个数字,后跟 0+ 个空格,后跟 1+ 个单词字符,以匹配和捕获长度及其在第 2 组中的单位

推荐阅读