也许你们中的某个人可以帮助我,或者为我指明如何在 Excel 中解决此问题的正确方向。
我有一个工作表,其中的单元格包含混合值,例如:
texxtext W.1234.56 文本
文本文本U.3853.23
P.3853.34 文本文本
我只需要中间的特定文章编号 (X.XXXX.XX)。就像这个正则表达式模式 ([A-Za-z].\d\d\d\d.\d\d)
有没有办法用公式函数来实现这一点?
提前致谢!
[A-Za-z].\d\d\d\d.\d\d
最佳答案
PY():
如果适用,您可以使用 PY()
函数来实现此目的:
B1
中的公式:
=PY(
xl("A1:A3").replace(r'.*\b([A-Za-z]\.\d{4}\.\d{2})\b.*', r'\1', regex=True)[0].values
)
‡在撰写本文时,PY()
仅在 ms365 订阅的测试版 channel 内可用。
搜索():
否则,首先尝试更简单的方法,看看在常规 SEARCH()
模式中使用通配符是否足够:
=MID(A1:A3,SEARCH("?.????.??",A1:A3),9)
‡使用这种方法,我假设文本中没有或很少有机会存在遵循该确切模式的其他子字符串。
FILTERXML():
另一种更复杂的方法是使用FILTERXML()
。这样您就可以利用 xpath-patterns 来检查手头的模式:
=FILTERXML("<t><s>"&SUBSTITUTE(A1:A3," ","</s><s>")&"</s></t>","//s[string-length()=9][concat(substring(., 2, 1),substring(.,7,1))='..'][translate(substring(.,1,1),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','')=''][concat(substring(.,2,4),substring(.,8))*0=0]")
这里谓词的 and-ing 结构的意思是:
[string-length()=9]
- 检查节点长度是否为 9 个字符;[concat(substring(., 2, 1),substring(.,7,1))='..']
- 当我们连接第二个和第七个字符时,它等于 '. .';[translate(substring(.,1,1),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','')='']
- 如果我们将第一个索引处的字符从任何(大写)字母字符翻译为什么都没有,它等于一个空字符串;[concat(substring(.,2,4),substring(.,8))*0=0]
- 如果我们连接剩余的字符并将其乘以零,则结果将等于零.
‡ 这里我假设以空格分隔的字符串开头。我们使用空格将文本分割成节点。如果标点符号发挥作用,这就不再那么简单了。
‡‡ 有关 FILTERXML()
的更多信息 here
关于excel - 提取单元格内的特定值(正则表达式模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77541516/