提问人:smoking anthill 提问时间:11/16/2023 最后编辑:InSyncsmoking anthill 更新时间:11/17/2023 访问量:61
什么谷歌表格正则表达式公式会将可变长度的泰语文本拆分为不同的单元格,但条件灵活
what google sheets regex formula will split thai text of variable lengths into different cells but with flexible conditions
问:
我正在尝试为谷歌表格公式 regexreplace 找到一个正则表达式来划分以下泰语文本,以便更容易管理,即在单独的单元格中使用谷歌翻译公式进行翻译。
(请注意,此文本是混合搭配的,以显示我需要处理的长度类型,即它不一定有意义!
有些文本很长(多个单词放在一起,这很好,可以保持这种状态。但是有些很短,只有 3、4 或 5 个字符,如果它们太短,我不想将它们分开,即将短单词组合成一个单元格 - 只是不要太长!
关键 Critera,因此,如果文本是连续的并且超过 15 个字符,则将其放置在一个单元格中。如果几个小单词说 3 到 5 个字母的单词,用空格分隔,那么它们可以连接起来,但应该限制在说 20 个字符。如果有句号,则不要在同一单元格中包含句号之后的单词,即使它们加起来不会超过 20 个字符。
提前感谢您的任何帮助/建议
กถามรรคที่เล่าเรื่องตั้งแต่ พระมหาสัตว์ได้ตั้งปรารถนาอย่างจริงจัง ณ เบื้องบาทมูลของพระพุทธเจ้าทรงพระนามว่า ทีปังกร จนถึงจุติจากอัตภาพเป็นพระเวสสันดร แล้วไปเกิดในสวรรค์ชั้นดุสิต จัดเป็น ทูเรนิทาน.
บทว่า ขณนฺตา แปลว่า ขุดภาคพื้น.
ศัพท์ว่า อุท ในบทว่า อุทงฺคเณ นี้ เป็นนิบาต อธิบายว่า ในที่ลานกลางแจ้ง.
成为
กถามรรคที่เล่าเรื่องตั้งแต่
พระมหาสัตว์ได้ตั้งปรารถนาอย่างจริงจัง ณ
เบื้องบาทมูลของพระพุทธเจ้าทรงพระนามว่า
ทีปังกร (because the preceding and following text (word/s) are long (ie without any white space)
จนถึงจุติจากอัตภาพเป็นพระเวสสันดร
แล้วไปเกิดในสวรรค์ชั้นดุสิต
จัดเป็น ทูเรนิทาน.
ศัพท์ว่า อุท ในบทว่า
อุทงฺคเณ นี้ เป็นนิบาต
อธิบายว่า ในที่ลานกลางแจ้ง.
我一直在使用不同的 AI 机器人来帮助并试图修改它们,但不是运气......
(我还添加了拆分、转置或展平以将其放入单独的单元格/行中 - 但这部分似乎很好,尽管我也尝试使用但没有运气)char(10)
也许我试图让正则表达式做太多事情。也许在应用不同的正则表达式公式之前,我需要以某种方式使用计数函数......
(注意,您将看到各种数字参数,例如 14、99、4 等......尝试在表达式中使用一些不同的数字,以尝试查看它们是否产生更好的结果)
=TRANSPOSE(SPLIT(REGEXREPLACE(G2,"(.{1,20})(\s+|$|\.)", "♦$1"), "♦"))
这会在单词到达空白区域之前将其切断。我只希望它在到达空白、句号或行尾时被切断。它不能在一个词的中间切断。
=FLATTEN(split(REGEXREPLACE(G2,"((\S+\s+){1,4}\S.{14,99})(\s+|$)","$1 ^^^"),"$1 ^^^"))
这只是根据空格选取每个单独的单词。所以有些太短了。
=TRANSPOSE(REGEXREPLACE(G1, "({\w{1,2}\s+}|[^\s]{4,444})","$1"))
拾取每个单词,不允许它们更长。
衷心感谢任何反馈
答:
为了达到根据您在 Google 表格中指定的条件拆分泰语文本的预期结果,可能需要将正则表达式和一些特定于表格的函数组合在一起。挑战在于标准的复杂性:组合短词,拆分较长的单词,以及像句号一样处理标点符号。
鉴于您概述的约束和要求,以下是在 Google 表格中使用正则表达式公式的潜在解决方案:
- 标准:
- 如果文本是连续的并且超过 15 个字符,请将其放在一个单元格中。
- 如果有几个小单词(3 到 5 个字母),它们最多可以连接 20 个字符。
- 如果有句号,请不要在同一单元格中包含句号后面的单词。
- 建议的正则表达式公式:
=TRANSPOSE(SPLIT(REGEXREPLACE(A1, "((?:\S{1,5}\s+){0,4}\S{1,5})(?:\s+|$|\.)(?=\s|\.|$)", "$1♦"), "♦"))
- 说明:
((?:\S{1,5}\s+){0,4}\S{1,5})
:这部分最多匹配 20 个字符,考虑 3 到 5 个字符的单词。它最多允许四个这样的单词后跟第五个单词,每个单词用空格分隔。(?:\s+|$|\.)
:此部分检查空格、行尾或句号。(?=\s|\.|$)
:此前瞻可确保匹配不包括空格或句号。♦
用作分隔符来拆分文本。您可以替换为文本中未出现的任何字符。♦
TRANSPOSE(SPLIT(…, "♦"))
:这会将替换的文本拆分为单独的行。♦
请记住,正则表达式可能非常具体,数据中的细微变化可能需要对公式进行调整。此外,泰文及其结构的复杂性可能会带来仅靠正则表达式无法完全解决的挑战。测试和调整对于完善结果至关重要。
根据评论更新
鉴于 Google 表格使用 RE2 正则表达式库,该库不支持 lookahead () 或 lookbehind () 断言,我们需要修改该方法。由于对于单个正则表达式模式,您的要求非常复杂,尤其是在不使用前瞻或后视的情况下,因此更可行的方法可能是使用公式组合或多步骤过程。?=
?<=
下面是另一种方法:
- 初始拆分:用于在适当的位置插入分隔符(如)。
REGEXREPLACE
♦
- 后处理:使用其他公式根据您的条件优化拆分。
下面是一个没有 lookahead 的修改后的正则表达式公式:
=TRANSPOSE(SPLIT(REGEXREPLACE(A1, "(\S{1,5}\s+){0,4}\S{1,5}(?=\s|$|\.)(?:\s|$|\.)*", "$0♦"), "♦"))
评论