如何提取两个点之间的文本

Posted

技术标签:

【中文标题】如何提取两个点之间的文本【英文标题】:How to extract text between two dots 【发布时间】:2020-12-08 13:09:09 【问题描述】:

你好,谁能告诉我。

示例:goldintre.cr.usgs.gov.

我想要从第一个点到最后一个点的所有文本(开头和结尾都没有点)

这必须在不从源文本中删除最后一个点的情况下完成。

谢谢

【问题讨论】:

嗨,欢迎来到 SO。你想要cr.usgs 作为输出吗?或cr.usgs.gov? 我认为 op 想用. 作为分隔符分割字符串 【参考方案1】:

警告:以下所有可能的答案都假设您的值中至少有 两个 点!如果不是这种情况,您需要在 LibreCalc 将显示为空的 Excel 中包含和 IFERROR()


LibreCalc

B1中的公式:

=REGEX(A1;"(?:^[^.]*\.|\.[^.]*$)";"";"g")

对模式的一点解释:

(?: - 打开非捕获组。 ^[^.]*\. - 开始字符串 ancor,后跟零个或多个字符而不是文字点,然后是一个点。 | - 或者。 \.[^.]*$ - 文字点,后跟零个或多个字符,而不是文字点,后跟结束字符串 ancor。 ) - 关闭非捕获组。

根据this在线演示,您可以看出替换现在将“删除”标记的文本。

请注意,分号是 LibreCalc 中的标准分隔符(并且经常被作为 Excel 标准分隔符的逗号混淆)。


Excel 2019/O365

B1中的公式:

=TEXTJOIN(".",,FILTERXML("<t><s>"&SUBSTITUTE(A1,".","</s><s>")&"</s></t>","//s[position()>1][position()<last()]"))

虽然当您拥有 Excel O365 时,它是 LET() 的一个更长的替代方案,但它也适用于 Excel 2019,并使用 TEXTJOIN() 和一些 XPATH 表达式,这意味着:

//s - 返回所有“s”节点。 [position()&gt;1] - 节点的位置大于第一个索引并且: [position()&lt;last()] - 节点位置小于最后一个索引。

有关该构造的更多信息,我认为您可以查看this。以前的帖子。

请注意,您也可以在 LibreCalc 中使用它,但您需要使用修改后的安装,因为默认功能 FILTERXML() 有一个错误。


一般的 Excel:

对于较旧的 Excel 版本,您可以使用:

=MID(A1,FIND(".",A1)+1,FIND("|",SUBSTITUTE(A1,".","|",LEN(A1)-LEN(SUBSTITUTE(A1,".",""))))-FIND(".",A1)-1)

基本上,我们首先确定字符串中有多少个点,然后SUBSTITUTE() 管道符号中的最后一个点(或任何唯一字符),然后才能FIND() 它的位置。如果我们确定第一个点的位置,那么当我们在MID() 中提供起始和长度参数时,计算就很简单了。


编辑

从 OP 的结尾得到更好的解释后,他的字符串值似乎总是以点结尾。在这种情况下,您可以简单地 REPLACE() 字符串的第一部分:

=REPLACE(LEFT(A1,LEN(A1)-1),1,FIND(".",A1),"")

这也将使在 LibreCalc 中的工作变得更容易:

=REGEX(A1;"^[^.]*\.(.*).$";"$1";"g")

【讨论】:

哦!我刚刚注意到你提出了一个类似的建议。赞成。【参考方案2】:

您没有为您的数据提供足够的详细信息以及所需的输出。那么让我们考虑所有的可能性。

Case-1 你总是有一个.,并且你想要在第一个点和最后一个点之间的文本。使用这个公式 -

=MID(A1, SEARCH(".", A1)+1, LEN(A1)-SEARCH(".", A1)-1)

这会给你cr.usgs.gov作为输出。

案例 2 您无需考虑最后一个点并删除该点之前的文本(再次假设最后一个点位于最后一个位置)

=MID(A1,SEARCH(".",A1)+1, SEARCH("$",SUBSTITUTE(A1,".", "$", LEN(A1)-LEN(SUBSTITUTE(A1, ".", ""))-1))-SEARCH(".",A1)-1)

这将为您提供cr.usgs 作为输出(还假设$ 在您的任何文本字符串中都不存在。

其他情况当您在所有最后的地方都没有点时。为此,您必须稍微调整一下公式。

=MID(A1,SEARCH(".",A1)+1, SEARCH("$",SUBSTITUTE(A1,".", "$", LEN(A1)-LEN(SUBSTITUTE(A1, ".", ""))))-SEARCH(".",A1)-1)

如果您的输入 (A1) 是 ab.cd.ef.ghi,这将为您提供输出 cd.ef。在 case-2 公式中,我刚刚删除了额外的 -1,它用于从文本字符串中排除最后一个点。

注意此公式适用于所有版本的 excel。

【讨论】:

感谢您提供的公式有效。我很抱歉没有提供足够的信息。案例 1 是我正在寻找的答案。 :D 对,所以这比最初想象的要简单得多 =)。好答案 AnilGoyal,赞成。为了您的兴趣,我还提供了一些更短的解决方案,可以避免重复搜索@KarloHorvat。 是的,如果最后有一个点,解决方案会更容易。 @KarloHorvat,我认为所有答案都应该得到您的支持,因为所有答案都是正确的。【参考方案3】:

如果您有 Excel 365,那么对于单元格 A1 中的数据,请使用:

=LET(x,FIND(".",A1)+1,y,LEN(A1),MID(A1,x,y-x))

(假设末尾总是有一个点)

【讨论】:

我越来越喜欢 O365 中的 LET() 函数。 请注意您的公式并不能很好地工作,它目前确实删除最后一个点(以及最后一个点之后的潜在字符,例如:goldintre.cr.usgs.gov.test 产生@987654326 @)。不过这个想法很好 =) @JvdV 你是对的!该公式假定末尾有一个 .

以上是关于如何提取两个点之间的文本的主要内容,如果未能解决你的问题,请参考以下文章

如何选择和提取两个元素之间的文本?

提取两个文件之间的差异值[重复]

提取两个不同标签之间的文本 美丽的汤

Oracle SQL:提取两个字符之间的文本

Python - 在其他两个特定字符之间的字符串中提取文本?

使用 lxml 提取两个 HTML 标题之间的所有文本