regex - 正则表达式突出显示长于 n 个单词的句子
问题描述
我正在尝试编写一个正则表达式,可用于识别文档中的长句。我的情况是一份科学手稿。我的目标是在自由办公室或任何带有正则表达式搜索的文本编辑器中这样做。
到目前为止,我在大多数情况下都可以使用以下表达式:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*,*\:*\s+){24,}?(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*[\.|?|!|$])
顺便说一句,我从这篇文章中得到了启发
它包含:
group1:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*,*\:*\s+)
a repetition element (stating how many words n - 1):
{24,}?
group2:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*[\.|?|!|$])
基本功能是: group1 匹配任意数量的单词字符或文本中出现的其他字符,后跟一个或多个空格 group1 必须重复 24 次(或尽可能多地重复句子) group2 匹配任何文本中出现的单词字符或其他字符的数量,后跟句号、感叹号、问号或分段符。
然后将突出显示满足上述所有条件的任何字符串。
到目前为止,我无法解决的是当文本中出现一个点时,它的含义不是句号。诸如:即,例如,等人,图,1.89 等......我也不喜欢我必须手动调整它以能够处理包含非单词字符的句子,例如,[ ( % - # µ " ' 等等。每次遇到其他不常见的字符时,我都必须扩展表达式。
对于解决此问题的其他方法的任何帮助或建议,我将很高兴。
解决方案
您可以使用正则表达式的瑞士军刀做很多事情,但是您提出的问题接近正则表达式的限制。您想要检测的某些事情可能只需非常小的更改即可处理,而其他事情则更难一些。如果您的目标是拥有某种工具来准确测量每个可能的字符突变的句子长度,那么您可能需要从 LibreOffice 移到专用的自定义软件或第三方工具。
但是,也就是说,如果您想避免编程或其他工具,您可以在现有的正则表达式中使用一些技巧以使其更好地工作。让我们看一些可能对您有用的技术:
您可能可以通过直接包含它们来针对一些特殊情况调整您的正则表达式,例如
Fig.
andMr.
。在你目前拥有的地方[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+
,基本上[\w]+
是一堆其他“特殊”字符,你可以使用类似的东西([\w|...]+|Mr\.|Mrs\.|Miss\.|Fig\.)
(当然,用我写的所有特殊字符替换...
)。正则表达式是“贪婪”算法,并且会尝试尽可能多地使用文本,因此通过直接包含特殊的“点词”,您可以使正则表达式“跳过”文本中存在问题的某些句点字符。确保当您要添加“要跳过的句点”时,始终在其前面加上反斜杠,例如 ini\.e\.
,这样它就不会被视为特殊的“任何”字符。一个类似的技巧可以更好地捕捉数字,假设数字后面跟着一个句点,然后是更多的数字应该“吃掉”句号:
([\w|...]+|\d+\.\d+|...)
这并不能处理所有事情,如果你的文档作者正在写像0.
句子中间这样的东西,那么你有一个棘手的问题,但它至少可以正确处理pi和e。此外,现在,您的正则表达式会使用字符,直到它到达任何终止标点符号 - a
.
、 or!
、 or?
或文档末尾。这对于像i.e.,
and之类的东西来说是个问题3.14
,因为就您的正则表达式而言,句子停在.
. 您可以要求您的正则表达式仅在到达时才停止句子._
- 一个句点后跟一个空格。这不会解决诸如 之类的单词的不匹配问题Mr.
,但它会将“单词”3.14
视为一个单词而不是句子的结尾,这比您现在更接近。为此,您必须在“单词”正则表达式中包含一个奇数序列,例如(\.[^ ])
,它表示“点后跟非空格”是单词的一部分;然后您必须将终止序列更改为(\. |!|?|$)
.!
对和重复这些更改?
。另一个有用的技巧是利用字符代码范围,而不是直接对每个特殊字符进行编码。现在,你正在努力做到这一点,拼出宇宙中的每一个重音字符、二合字母和变音符号。相反,您可以只说“特殊字符”的所有内容都被视为“单词”的一部分:而不是
[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+
, write[\w|\-|\/|\u0080-\uFFFF]
,它捕获除表情符号和一些真正晦涩的死语言之外的每个字符。LibreOffice似乎支持 Unicode,因此使用\uXXXX
模式应该在[
字符范围内工作]
。
这可能足以让您的正则表达式在 LibreOffice 中有所接受,甚至可能足以回答您的问题。但是,如果您真的打算像这样进行更复杂的文档分析,最好将文档导出为纯文本,然后在其上运行专门的工具。
推荐阅读
- java - 阿基里斯抛出“IllegalStateException:未知的当前类型:java.util.Collection
" - audio - 如何解决以下错误消息:应该已经设置了字幕控制器
- css - 将空间分成 3 个平行的块
- python - Pyomo(v5.2)python(v3.7)脚本解决具体模型抛出ValueError:未定义目标;无法写入合法的 LP 文件
- c - 变量未更新,While 循环不起作用
- android - 屏幕截图另存为空白图像 [Android]
- sql - AngularJS 不接收 socket.io 发出的新数据
- sql - 在 SQL 上,做公式的最佳方法是什么?
- exchangewebservices - 日历委派的 EWS 通知
- import - 在 SAS 中组合具有不同列的 Excel 表