【问题标题】:How to extract words entirely written in uppercase with accents (Diacritics) with a Google Sheet REGEXEXTRACT formula?如何使用 Google Sheet REGEXEXTRACT 公式提取完全用大写字母写的带有重音符号(变音符号)的单词?
【发布时间】:2021-03-27 03:35:50
【问题描述】:

好的,

它看起来很简单,但是当单词以重音开头或结尾时,它就是一团糟。 我看过 Stack Overflow 和其他人,并没有真正找到解决这个问题的方法。 我希望能够使用 Google 表格公式从单元格中提取仅使用以下 ASCII 字符构建的单词: A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y, Z,À,Á,Â,Ã,Ä,Å,Æ,Ç,È,É,Ê,Ë,Ì,Í,Î,Ï,Ð,Ñ,Ò,Ó,Ô,Õ,Ö,Ø, Ù,Ú,Û,Ü,Ý

例如,“Éléonorä-Camilliâ ÀLËMMNIÖ DE SANTORINÕ”或“ÀLËMMNIÖ DE SANTORINÕ Éléonorä Camilliâ”的结果必须是相同的“ÀLËMMNIÖ DE SANTORINÕ”

这个公式在没有重音时有效: =REGEXEXTRACT(A2;"\b[A-Z]+(?:\s+[A-Z]+)*\b")

这些公式有时在名称很简单的情况下起作用。

=REGEXEXTRACT(A2;"\b[A-Ý]+(?:\s+[A-Ý]+)*\b")

=REGEXEXTRACT(A2;"\B[A-Ý]+(?:\S+[A-Ý]+)*\B")

谁能帮助我或给我一些提示?

【问题讨论】:

    标签: regex google-sheets ascii diacritics


    【解决方案1】:

    您的预期匹配似乎只是在空格或字符串的开头/结尾之间。如果在单元格值前后添加空格,则可以简单地提取空格之间的所有以空格分隔的大写字母单词块,公式将归结为

    =REGEXEXTRACT(" " & A2 & " "; "\s([A-ZÀ-ÖØ-Ý]+(?:\s+[A-ZÀ-ÖØ-Ý]+)*)\s")
    

    查看 Google 表格演示:

    正则表达式详细信息

    • \s - 一个空格
    • ([A-ZÀ-ÖØ-Ý]+(?:\s+[A-ZÀ-ÖØ-Ý]+)*) - 第 1 组(REGEXEXTRACT 返回的实际值):指定范围内的一个或多个大写字母后跟零个或多个重复的一个或多个空格,然后是一个或多个大写字母
    • \s - 一个空格。

    您也可以使用 ARRAYFORMULA:

    =ARRAYFORMULA(IFERROR(REGEXEXTRACT(" " & A:A & " ", "\s([A-ZÀ-ÖØ-Ý]+(?:\s+[A-ZÀ-ÖØ-Ý]+)*)\s"),""))
    

    【讨论】:

    • 您好,感谢您的帮助。该公式在 RE2 Regex Demo 中非常有效,我有最糟糕的例子,但我想知道 Google Sheets 是否真的与 RE2 兼容。我得到了一个很棒的#REF! , "(?:\P{L}|^)(\p{Lu}+(?:\s+\p{Lu}+)*)(?:\P{L}|$)" 无效正则表达式...
    • @AntoninThuillier 哦,对了,“Google 产品使用 RE2 进行正则表达式。Google 表格支持 RE2Unicode 字符类匹配除外”我用新的正则表达式替换了正则表达式,但我认为这里实际上还有另一个错误,与在 Google RE2 实现中使用非捕获组有关。
    • @AntoninThuillier 抱歉,非捕获组错误似乎仍然存在。因此,我建议使用我的第一个正则表达式/(?<!\p{L})\p{Lu}+(?:\s+\p{Lu}+)*(?!\p{L})/u 使用带有 Google Apps 脚本的自定义正则表达式提取函数
    • 您好,再次感谢您,这太疯狂了,不是吗?期待 "(?:[^A-Za-zÀ-ÖØ-Ýà-öø-ý\n]|^)([A-ZÀ-ÖØ-Ý]+(?:\s+[A-ZÀ-ÖØ- Ý]+)*)(?:[^A-Za-zÀ-ÖØ-Ýà-öø-ý]|$)" (顺便说一句,这是一个公式!)它工作得非常好,除了它也与下一个单词的最后一个大写字母。例如“CHALOBAH Trevoh”的匹配是“CHALOBAH T”。我不能使用脚本,因为我必须经常分享和复制这张表格。
    • @AntoninThuillier 事实上,该字母未被捕获,因此不能返回,因为 REGEXEXTRACT 仅在定义捕获组的情况下返回捕获的值。这是一个错误。因此,您需要一种解决方法,请参阅我的帖子顶部。
    【解决方案2】:

    假设您的示例名称在 A2 中,这应该可以:

    =TRIM(REGEXEXTRACT(A2&" ","([A-ZÀ-Ý ]+)\s"))

    通过首先在字符串末尾附加一个空格,我们可以在任何以空格结尾的数字中查找[大写字母集或空格]。这排除了像“Éléonorä”和“Camilliâ”这样的字符串,因为这些大写字母后面没有空格。

    换一种说法,这里的规则说:“在这个集合中尽可能多地抓取大写字母或空格,只要最后还有空格。”由于我们在整个字符串的末尾附加了一个空格,因此我们可以在修改后的字符串中的任何位置捕获此类分组。

    【讨论】:

      【解决方案3】:

      试试这个 - 反斜杠非 A-Z 字符。

      [A-Z\À\Á\Â\Ã\Ä\Å\Æ\Ç\È\É\Ê\Ë\Ì\Í\Î\Ï\Ð\Ñ\Ò\Ó\Ô\Õ\Ö\Ø\Ù\Ú\Û\Ü\Ý]
      

      如果失败,您可以对这些字母中的每一个进行编码,如下所示: 查找字符:https://www.w3schools.com/charsets/ref_utf_latin1_supplement.asp

      [A-Z\u00C0\u00C1... and so on...]
      

      【讨论】:

        【解决方案4】:

        使用:

        =ARRAYFORMULA(TRIM(TRANSPOSE(QUERY(TRANSPOSE(IF(""<>
         IFERROR(REGEXEXTRACT(SPLIT(A1:A, " "), "["&TEXTJOIN("", 1, 
         UNIQUE(QUERY({UPPER(CHAR(ROW(65:1500))), LOWER(CHAR(ROW(65:1500)))}, 
         "select Col2 where Col1<>Col2")))&"]+")),,IFERROR(SPLIT(A1:A, " ")))),,9^9))))
        

        或短 10 个字符:

        =INDEX(TRIM(TRANSPOSE(QUERY(TRANSPOSE(IF(""<>
         IFERROR(REGEXEXTRACT(SPLIT(A:A; " "); "["&JOIN(; 
         UNIQUE(LOWER(QUERY(CHAR(ROUNDUP(SEQUENCE(1500; 2; 65)/2)); 
         "select Col1 where lower(Col1)<>upper(Col2)"))))&"]+"));;
         IFERROR(SPLIT(A:A; " "))));;9^9))))
        

        适用于所有欧洲字母表并捕捉所有变音符号。它可以区分:

        降低

        上层

        【讨论】:

        • 非常感谢 Player0 !它工作得很好。我只需要“欧洲化”你令人难以置信的第一个公式。明天我会测试你第二个较短的。您是否看到过滤数字的方法(我使用 Regexreplace)?
        • @AntoninThuillier 取决于示例,但数字也不应该成为问题
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 2022-12-14
        • 2019-07-01
        • 1970-01-01
        • 2019-12-08
        • 2017-08-24
        相关资源
        最近更新 更多