使用正则表达式查找缩写

Using regex to find abbreviations

我正在尝试创建一个正则表达式来识别 Python 中给定字符串中的可能缩写。我是 RegEx 的新手,虽然我相信它应该有点简单,但我在创建表达式时遇到了困难。该表达式应选择具有两个或更多大写字母的单词。该表达式还应该能够拾取中间使用破折号的单词并报告整个单词(破折号前后)。如果数字也存在,它们也应该用单词报告。

因此,它应该回升:

ABC、AbC、ABc、A-ABC、a-ABC、ABC-a、ABC123、ABC-123、123-ABC。

我已经做了以下表达:r'\b(?:[a-z]*[A-Z\-][a-z\d[^\]*]*){2,}'.

然而,这也会发现这些错误的词:

A-bc, a-b-c

我认为问题在于它寻找多个大写字母 破折号。我希望它只给我至少有两个或更多大写字母的单词。我知道它也会“错误地”将单词视为“Abc-Abc”,但我认为没有办法避免这些。

如果支持前瞻并且您不想匹配双 -- 您可以使用:

\b(?=(?:[a-z\d-]*[A-Z]){2})[A-Za-z\d]+(?:-[A-Za-z\d]+)*\b

说明

  • \b一个单词边界
  • (?=正向前瞻,断言从当前位置向右是
    • (?:[a-z\d-]*[A-Z]){2} 匹配 2 次可选的允许字符和一个大写字符 A-Z
  • ) 关闭前瞻
  • [A-Za-z\d]+ 匹配 1+ 次不带连字符的允许字符
  • (?:-[A-Za-z\d]+)* 可选择重复 - 和 1+ 次允许的字符
  • \b一个单词边界

看到一个regex101 demo.

要在字符周围有连字符时也不匹配,您可以使用否定环视断言左侧或右侧不是连字符。

\b(?<!-)(?=(?:[a-z\d-]*[A-Z]){2})[A-Za-z\d]+(?:-[A-Za-z\d]+)*\b(?!-)

再看一个regex demo