正则表达式突出显示长于 n 个单词的句子
regex to highlight sentences longer than n words
我正在尝试编写可用于识别文档中长句子的正则表达式。我的案例是一份科学手稿。我的目标是在自由办公室或任何带有正则表达式搜索的文本编辑器中做到这一点。
到目前为止,我在大多数情况下都能使用以下表达式:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*,*\:*\s+){24,}?(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*[\.|?|!|$])
顺便说一句,我从这个 post
中得到启发
它包含:
group1:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*,*\:*\s+)
a repetition element (stating how many words n - 1):
{24,}?
group2:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*[\.|?|!|$])
基本功能是:
group1 匹配文本中出现的任意数量的单词字符或其他字符,后跟一个或多个空格
group1 必须重复 24 次(或者你想要的句子有多长)
group2 匹配文本中出现的任意数量的单词字符或其他字符,后跟句号、感叹号、问号或分段符。
任何满足上述所有条件的字符串都会被突出显示。
到目前为止我无法解决的是当文本中出现一个点而不是一个句号时,它会起作用。诸如此类:即,例如,等人、图、1.89 等……
我也不喜欢我必须手动调整它才能处理包含非单词字符的句子,例如,[ ( % - # µ " ' 等等。我每次都必须扩展表达式遇到其他一些不常见的角色。
如果有任何帮助或其他解决方法的建议,我将很高兴。
您可以使用正则表达式这把瑞士军刀做很多事情,但是您提出的问题接近正则表达式的极限。您想要检测的某些内容可能可以通过非常小的更改来处理,而其他内容则有点困难。如果您的目标是拥有某种工具来准确测量每个可能的字符突变的句子长度,您可能需要从 LibreOffice 转移到专用的自定义软件或第三方工具。
但是,就是说,如果您想避免编程或使用其他工具,您可以将一些技巧融入现有的正则表达式中以使其更好地工作。让我们看看一些可能对您有用的技巧:
您可以针对一些特殊情况调整正则表达式,例如 Fig.
和 Mr.
,方法是直接包含它们。在你目前有 [\w|\-|–|−|\/|≥|≤|’|“|”|μ]+
,基本上是 [\w]+
和一堆其他 "special" 字符的地方,你可以使用类似 ([\w|...]+|Mr\.|Mrs\.|Miss\.|Fig\.)
的东西(替换我写的所有特殊字符...
,当然)。正则表达式是 "greedy" 算法,并且会尝试尽可能多地使用文本,因此通过直接包含特殊的 "dot words",您可以使正则表达式 "skip over" 某些有问题的句点字符你的文字。确保当你想添加一个 "period to skip" 时,你总是在它前面加上一个反斜杠,就像在 i\.e\.
中一样,这样它就不会被视为特殊的 "any" 字符。
一个类似的技巧可以更好地捕获数字,假设数字后跟句点后跟更多数字应该 "eat" 句点:([\w|...]+|\d+\.\d+|...)
那不处理一切,如果你的文档作者在句子中间写 0.
这样的东西,那么你就有一个棘手的问题,但它至少可以处理 pi 和 e 正确。
此外,现在,您的正则表达式会消耗字符,直到它到达任何终止标点符号 — .
、或 !
、或 ?
,或文件的结尾。对于 i.e.,
和 3.14
之类的东西来说,这是一个问题,因为就您的正则表达式而言,句子在 .
处停止。您 可以 要求您的正则表达式仅在达到 ._
时停止句子 - 句号后跟 space。这不会修复像 Mr.
这样的词的不匹配,但它会将 "words" 像 3.14
一样当作一个词而不是句子的结尾,这比你现在更接近。为此,您必须在 "word" 正则表达式中包含一个奇数序列,例如 (\.[^ ])
,表示 "dot followed by not-a-space" 是单词的一部分;然后您必须将终止序列更改为 (\. |!|?|$)
。对 !
和 ?
.
重复类似的更改
另一个有用的技巧是利用字符代码范围,而不是直接对每个特殊字符进行编码。现在,您正在以艰难的方式进行,通过拼出宇宙中的每个重音字符、二合字母和变音符号。相反,您可以只说 属于 "special character" 的所有内容 都被认为是 "word" 的一部分:写 [=33 而不是 [\w|\-|–|−|\/|≥|≤|’|“|”|μ]+
=],它捕获了除表情符号之外的每个字符和一些来自真正晦涩的死语言的字符。 LibreOffice seems to have Unicode 支持,因此使用 \uXXXX
模式应该在 [
个字符范围内工作 ]
.
这可能足以使您的正则表达式在 LibreOffice 中得到一定程度的接受,甚至可能足以回答您的问题。但是,如果您真的打算像这样进行更复杂的文档分析,最好将文档导出为纯文本,然后 运行 使用专门的工具。
我正在尝试编写可用于识别文档中长句子的正则表达式。我的案例是一份科学手稿。我的目标是在自由办公室或任何带有正则表达式搜索的文本编辑器中做到这一点。
到目前为止,我在大多数情况下都能使用以下表达式:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*,*\:*\s+){24,}?(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*[\.|?|!|$])
顺便说一句,我从这个 post
中得到启发它包含:
group1:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*,*\:*\s+)
a repetition element (stating how many words n - 1):
{24,}?
group2:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*[\.|?|!|$])
基本功能是: group1 匹配文本中出现的任意数量的单词字符或其他字符,后跟一个或多个空格 group1 必须重复 24 次(或者你想要的句子有多长) group2 匹配文本中出现的任意数量的单词字符或其他字符,后跟句号、感叹号、问号或分段符。
任何满足上述所有条件的字符串都会被突出显示。
到目前为止我无法解决的是当文本中出现一个点而不是一个句号时,它会起作用。诸如此类:即,例如,等人、图、1.89 等…… 我也不喜欢我必须手动调整它才能处理包含非单词字符的句子,例如,[ ( % - # µ " ' 等等。我每次都必须扩展表达式遇到其他一些不常见的角色。
如果有任何帮助或其他解决方法的建议,我将很高兴。
您可以使用正则表达式这把瑞士军刀做很多事情,但是您提出的问题接近正则表达式的极限。您想要检测的某些内容可能可以通过非常小的更改来处理,而其他内容则有点困难。如果您的目标是拥有某种工具来准确测量每个可能的字符突变的句子长度,您可能需要从 LibreOffice 转移到专用的自定义软件或第三方工具。
但是,就是说,如果您想避免编程或使用其他工具,您可以将一些技巧融入现有的正则表达式中以使其更好地工作。让我们看看一些可能对您有用的技巧:
您可以针对一些特殊情况调整正则表达式,例如
Fig.
和Mr.
,方法是直接包含它们。在你目前有[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+
,基本上是[\w]+
和一堆其他 "special" 字符的地方,你可以使用类似([\w|...]+|Mr\.|Mrs\.|Miss\.|Fig\.)
的东西(替换我写的所有特殊字符...
,当然)。正则表达式是 "greedy" 算法,并且会尝试尽可能多地使用文本,因此通过直接包含特殊的 "dot words",您可以使正则表达式 "skip over" 某些有问题的句点字符你的文字。确保当你想添加一个 "period to skip" 时,你总是在它前面加上一个反斜杠,就像在i\.e\.
中一样,这样它就不会被视为特殊的 "any" 字符。一个类似的技巧可以更好地捕获数字,假设数字后跟句点后跟更多数字应该 "eat" 句点:
([\w|...]+|\d+\.\d+|...)
那不处理一切,如果你的文档作者在句子中间写0.
这样的东西,那么你就有一个棘手的问题,但它至少可以处理 pi 和 e 正确。此外,现在,您的正则表达式会消耗字符,直到它到达任何终止标点符号 —
.
、或!
、或?
,或文件的结尾。对于i.e.,
和3.14
之类的东西来说,这是一个问题,因为就您的正则表达式而言,句子在.
处停止。您 可以 要求您的正则表达式仅在达到._
时停止句子 - 句号后跟 space。这不会修复像Mr.
这样的词的不匹配,但它会将 "words" 像3.14
一样当作一个词而不是句子的结尾,这比你现在更接近。为此,您必须在 "word" 正则表达式中包含一个奇数序列,例如(\.[^ ])
,表示 "dot followed by not-a-space" 是单词的一部分;然后您必须将终止序列更改为(\. |!|?|$)
。对!
和?
. 重复类似的更改
另一个有用的技巧是利用字符代码范围,而不是直接对每个特殊字符进行编码。现在,您正在以艰难的方式进行,通过拼出宇宙中的每个重音字符、二合字母和变音符号。相反,您可以只说 属于 "special character" 的所有内容 都被认为是 "word" 的一部分:写 [=33 而不是
[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+
=],它捕获了除表情符号之外的每个字符和一些来自真正晦涩的死语言的字符。 LibreOffice seems to have Unicode 支持,因此使用\uXXXX
模式应该在[
个字符范围内工作]
.
这可能足以使您的正则表达式在 LibreOffice 中得到一定程度的接受,甚至可能足以回答您的问题。但是,如果您真的打算像这样进行更复杂的文档分析,最好将文档导出为纯文本,然后 运行 使用专门的工具。