复杂的文本提取

时间:2017-05-01 17:22:13

标签: excel find extract

我在单元格A1中有这个文字:

  

年龄风险:非常低的位置风险:非常高

我想在第一个冒号(“:”)和第二个冒号左边的第二个空格之间找到文本。单元格内容可能会发生显着变化,但使用此逻辑应始终捕获必要的文本。在这种特殊情况下,我试图隔离“非常低”

我可以找到冒号的位置(“:”)

  • 1st = FIND(“:”,A1) - 位置9
  • 2nd = FIND(“:”,A1,FIND(“:”,A1)+1) - 第33位

但是,我无法弄清楚如何计算第二个冒号左边的两个空格,以便能够在MID中使用它。

=MID(A1,FIND(":",A1)+2,(location of 2nd space to left of 2nd colon -FIND(":",A1)))

3 个答案:

答案 0 :(得分:2)

您可以使用复杂的公式来完成,但使用UDF和正则表达式会更简单。以下UDF

  • 删除所有内容,包括第一个冒号后面的任何空格
  • 然后在此之后捕获所有内容,直到通过向前看,它可以是一系列
  • 然后在那之后删除所有内容。

这样做的一个优点是,如果您发现描述并不总是匹配,则更容易修改。

Option Explicit
Function ExtractSpecial(S As String) As String
    Dim RE As Object

Set RE = CreateObject("vbscript.regexp")
With RE
    .Pattern = "^[^:]+:\s+(.*?)(?=\s+\S+\s+\S+:).*"
    .MultiLine = True
    ExtractSpecial = .Replace(S, "$1")
End With

End Function

编辑正则表达式模式的说明以及进一步说明的链接:

^ [^:] +:(<?EM>)\ S +(?= \ S + \ S + \ S + \ S +:)。

^[^:]+:\s+(.*?)(?=\s+\S+\s+\S+:).*

选项:不区分大小写; ^ $不匹配的换行

$ 1

使用RegexBuddy

创建

答案 1 :(得分:1)

假设你也总是有“位置”,你可以搜索它,并将其修剪下来:

=TRIM(MID(A1,SEARCH(":",A1)+1,SEARCH("location",A1)-SEARCH(":",A1)-1))

编辑:根据您的评论:

=TRIM(MID(A1,SEARCH(":",A1)+1,SEARCH(";",SUBSTITUTE(A1," ",";",4))-SEARCH(":",A1)))

答案 2 :(得分:1)

如果将所有空格扩展为原始长度的重复空格,则可以选择原始文本的哪一部分进行解析。

=TRIM(MID(SUBSTITUTE(A2, CHAR(32), REPT(CHAR(32), LEN(A2))), (B2-1)*LEN(A2)+1, C2*LEN(A2)))

enter image description here