![从句子中提取最后一个单词,减去任何结束标点](https://linux22.com/image/1563314/%E4%BB%8E%E5%8F%A5%E5%AD%90%E4%B8%AD%E6%8F%90%E5%8F%96%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E5%8D%95%E8%AF%8D%EF%BC%8C%E5%87%8F%E5%8E%BB%E4%BB%BB%E4%BD%95%E7%BB%93%E6%9D%9F%E6%A0%87%E7%82%B9.png)
答案1
RIGHT()
您对和功能的理解绝对正确SUBSTITUTE()
。
让我们来看看概括和组合公式的过程。
What to do?
为此,我们将使用中的句子A1
、RIGHT()
中的公式B1
以及SUBSTITUTION()
中的公式C1
。因此,您的公式将是=RIGHT(A1,3)
和=SUBSTITUTE(B1,"?","")
:
步骤1
我们需要概括一下:
<1> RIGHT(A1,3)
是最后一个单词(包括后面的标点符号)的长度3
,需要修改才能适用于任何句子。一种方法是认识到最后一个单词的长度可以根据句子的长度和最后一个空格的从一开始的索引来计算。
对于我们的例子来说,长度是 11,最后一个空格的索引是 8,
What to do?
↑ ↑
12345678 11
和 11 - 8 → 3
长度可以用以下公式计算:
<2> LEN(A1)
索引有点棘手,因为FIND()
只能用于查找第一个空间的索引,而不能用于其他任何空间。但是,我们可以使用SUBSTITUTE()
来提供帮助,因为它做允许我们替换任何特定的空格。如果我们将最后一个空格更改为句子中其他地方不存在的字符,我们可以然后用来FIND()
找到它,从而找到索引。
进行替换的公式是
<3> SUBSTITUTE(A1," ","§",2)
其中2
是最后一个空格(即第 2 个空格)的出现次数,并且希望§
不存在。
然后我们可以用来<3>
查找最后一个空格的索引,如下所示:
<4> FIND("§",SUBSTITUTE(A1," ","§",2))
但我们如何计算呢2
?这有点棘手。请注意,句子中最后一个空格的出现次数与数数句子中的空格。
可以通过从句子中删除空格来计算计数。这会将其长度减少计数。从这个和原始长度,我们可以得到计数:
<5> LEN(A1)-LEN(SUBSTITUTE(A1," ",""))
将其代入<4>
可得出最后一个空间索引的公式:
<6> FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))
减去这个数就<2>
可以得到最后一个单词的长度:
<7> LEN(A1)-FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))
<7>
重新插入<1>
导致普遍
<8> RIGHT(A1,LEN(A1)-FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))
第2步
我们需要概括一下:
<9> SUBSTITUTE(B1,"?","")
现在,由于SUBSTITUTE()
如果在目标字符串中找不到搜索字符串,则返回未修改的目标字符串,因此我们可以“链接”多个此函数来删除多个可能的标点符号。例如,要同时删除,!
我们可以这样做:
<10> SUBSTITUTE(<9>,"!","")
代<9>
入<10>
可得:
<11> SUBSTITUTE(SUBSTITUTE(B1,"?",""),"!","")
由于句子末尾只有三个标点符号,,,?
和!
(.
我希望)<10>
可以完全推广到这一点:
<12> SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B1,"?",""),"!",""),".","")
步骤3
合并这两个公式很简单,只需将B1
中的 替换<12>
为<8>
,即可得到解决方案:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(RIGHT(A1,LEN(A1)-FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))),"?",""),"!",""),".","")
笔记:
如果句子末尾没有标点符号(就像您截图中的第 21 句那样),那么这些SUBSTITUTE()
函数实际上不会执行任何操作,并且会正确返回最后一个单词。
如果数据集中的句子可以以其他字符结尾,比如:
,则可以轻松修改公式以适应这种情况。
最后,由于句子编号和第一个单词之间总是有一个空格,因此公式中不需要进行错误检查。将要然而,如果没有句子,则返回错误。
答案2
2018 表示 Excel 2016,除非另有说明FILTERXML()
。它可以以有用的方式使用,因为如果有一个表现良好的字符串,则可以使用分隔符将其分成单独的部分,从而使其被称为表现良好的字符串。在这种情况下,单词之间的空格。
这样就可以给出每个句子中的单词数组。它具有能够选择数组中单个元素的功能,更有帮助的是,还可以直接指定所选元素,因此无需计算元素。使用事先减去字符串的分隔符后再删除分隔符last()
并不难,但最好甚至不需要做那么多!LEN()
LEN()
SUBSTITUTE()
这样您就可以得到最后一个单词加上任何标点符号。要删除标点符号,您只需取RIGHT()
最后一个单词的最后面的字符,并将其与您认为可能会看到的标点符号列表进行比较。使用一个IF()
包裹它,为任何匹配项返回 1(显然是其中之一!),为所有失败返回 2,然后将其全部包裹在一个里面,SUM()
这样不仅会给您一个奇数或偶数值,还会将IF()
生成的数组折叠为总和值,而不是一堆有或没有 1 的 2。使用MOD()
2 作为除数来检查偶数(没有标点符号或奇数,然后显示输出或用 削去最后一个字符,Left()
您就会得到它:
=IF(MOD(SUM(IF(RIGHT(FILTERXML("<Outer><Inner>"&SUBSTITUTE(A1," ","</Inner><Inner>")&"</Inner></Outer>","/Outer/Inner[last()]"),1)={".",",",";"},1,2)),2)=0,FILTERXML("<Outer><Inner>"&SUBSTITUTE(A1," ","</Inner><Inner>")&"</Inner></Outer>","/Outer/Inner[last()]"),LEFT(FILTERXML("<Outer><Inner>"&SUBSTITUTE(A1," ","</Inner><Inner>")&"</Inner></Outer>","/Outer/Inner[last()]"),LEN(FILTERXML("<Outer><Inner>"&SUBSTITUTE(A1," ","</Inner><Inner>")&"</Inner></Outer>","/Outer/Inner[last()]"))-1))
看起来很糟糕,但那只是因为它FILTERXML("<Outer><Inner>"&SUBSTITUTE(A1," ","</Inner><Inner>")&"</Inner></Outer>","/Outer/Inner[last()]")
出现了四次。如果你用“LAST”替换它,它读起来会好得多:
=IF(MOD(SUM(IF(RIGHT(LAST,1)={".",",",";"},1,2)),2)=0,LAST,LEFT(LAST,LEN(LAST)-1))
(当然,以上方法不起作用,只是展示了公式的“骨架”。)
看到其中的标点符号字符串了吗?您只需将您认为可能遇到的任何内容添加到该字符串中即可。或者将一些单元格放在某个地方,并在其中逐个输入标点符号,然后使用该范围而不是像上面那样使用数组常量。
展望 2021 年及其LET()
功能,您可以使用它:
=LET(Punctuation,{".",",",";"}, Word,FILTERXML("<Outer><Inner>"&SUBSTITUTE(A1," ","</Inner><Inner>")&"</Inner></Outer>","/Outer/Inner[last()]"),IF(MOD(SUM(IF(RIGHT(Word,1)=Punctuation,1,2)),2)=0,Word,LEFT(Word,LEN(Word)-1)))
这样做的好处是可读性更强(在 Excel 中,而不是在这里),因为该FILTERXML()
部分只出现一次,而且标点符号数组出现在最开始,如果需要可以轻松添加。
当然,LAMDA()
很快就会有人添加更多内容。(我希望很快……)
答案3
我使用免费的 ExcelRegEx 查找/替换插件获得正则表达式功能。这可以让像你这样的情况变得更轻松。
该公式将如下所示:
=RegExReplace(A1,".* ([a-zA-Z]+)[.?!]*$","$1")
在哪里:
=RegExReplace(A1,...)
查看 A1 的内容.*
- 单元格中以空格结尾的任何内容([a-zA-Z]+)
- 后面跟着一个单词(可以包含大写和小写字母),并记住该单词[.?! ]*
- 后跟任意数量(包括 0)的标点符号和空格$"
- 就在牢房结束之前,"$1"
- 然后用记住的单词替换整个单元格内容。