正则表达式突出显示长度超过n个单词的句子

时间:2018-09-18 18:13:06

标签: regex text libreoffice

我正在尝试编写一个可用于识别文档中长句子的正则表达式。我的情况是科学手稿。我的目标是在libre office或任何带有正则表达式搜索的文本编辑器中做到这一点。

到目前为止,我可以在大多数情况下使用以下表达式:

(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*,*\:*\s+){24,}?(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*[\.|?|!|$])

顺便说一句,我从这个post

中得到启发

它包含:

group1:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*,*\:*\s+)


a repetition element (stating how many words n - 1):
{24,}?

group2:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*[\.|?|!|$])

基本功能是: group1匹配文本中存在的任意数量的单词字符或其他字符,后跟一个或多个空格 group1必须重复24次(或您希望句子长的次数) group2匹配文本中出现的任意数量的单词字符或其他字符,后跟句号,感叹号,问号或段落分隔符。

任何满足以上所有条件的字符串都将突出显示。

到目前为止,我无法解决的问题是,当文本中出现点而不是句号的其他含义时,使其起作用。像这样的东西:例如,et al。,Fig。,1.89等... 另外,我也不喜欢手动调整它以处理包含非单词字符的句子,例如[[%-#µ“'等。每次我都要扩展表达式遇到其他一些不常见的角色。

我很乐意提供其他解决方法的帮助或建议。

1 个答案:

答案 0 :(得分:0)

使用正则表达式swiss-army-knife可以做很多事情,但是您遇到的问题接近正则表达式的极限。您想要检测的某些事物可能只需很小的改动就可以处理,而其他一些则很难。如果您的目标是要使用某种工具来准确测量每种可能的字符突变的句子长度,则可能需要在LibreOffice外部使用专用的自定义软件或第三方工具。

但是,这就是说,如果您想避免编程或使用其他工具,可以通过一些技巧来侵入现有的正则表达式以使其更好地工作。让我们看一些可能对您有用的技术:

  • 您可以通过直接包含正则表达式来调整一些特殊情况,例如Fig.Mr.。当前您有[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+,基本上是[\w]+,带有一堆其他“特殊”字符,则可以使用类似([\w|...]+|Mr\.|Mrs\.|Miss\.|Fig\.)的名称(用我写{{ 1}},当然)。正则表达式是“贪婪的”算法,将尝试消耗尽可能多的文本,因此,通过直接包含特殊的“点词”,您可以使正则表达式“跳过”在文本中有问题的某些句点字符。确保要添加“要跳过的时间段”时,请始终在其前面加上反斜杠(例如...),以免将其视为特殊的“ any”字符。

  • 一个类似的技巧可以通过假设数字后跟一个句点再加上更多数字来“捕获”该句点来更好地捕获数字:i\.e\.不能解决所有问题,并且如果您的文档作者在句子的中间写着([\w|...]+|\d+\.\d+|...)之类的东西,那么您就遇到了一个棘手的问题,但它至少可以正确处理 pi e

  • 此外,现在,您的正则表达式会消耗字符,直到到达任何终止标点字符为止-0..!或文档末尾。对于诸如?i.e.,之类的问题,这是一个问题,因为就您的正则表达式而言,该句子在3.14处停止。您可以可以要求您的正则表达式仅在到达.时停止句子,即句号后加一个空格。这样并不能解决._之类的单词的不匹配问题,但是它将像Mr.这样的“单词”视为单词,而不是句子的结尾,这比您当前的位置更近。为此,您必须在“单词”正则表达式中包含一个奇数序列,例如3.14,它表示单词中包含“点后跟非空格”。然后您必须将终止顺序更改为(\.[^ ])。对(\. |!|?|$)!重复同样的操作。

  • 另一个有用的技巧是利用字符代码范围,而不是直接对每个特殊字符进行编码。现在,通过拼写出宇宙中每个重音符号,有向字母和变音符号,您都很难做到。取而代之的是,您可以说,所有属于“特殊字符”的 都被视为“单词”的一部分:代替?,而写[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+,它捕获了所有除了表情符号和一些真正晦涩的死语外,其他字符。 LibreOffice seems to have Unicode支持,因此使用[\w|\-|\/|\u0080-\uFFFF]模式应该在\uXXXX字符范围[内起作用。

这足以使您的正则表达式在LibreOffice中可以接受,甚至可能足以回答您的问题。但是,如果您真的打算进行这样的更复杂的文档分析,则最好将文档导出为纯文本,然后在其上运行专用工具。