繁体   English   中英

使用正则表达式查找缩写

[英]Using regex to find abbreviations

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

因此,它应该拿起:

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

我已经做了以下表达: r'\b(?:[az]*[AZ\-][az\d[^\]*]*){2,}'

然而,这也确实会出现这些错误的词:

A-BC, abc

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

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

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

解释

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

请参阅regex101 演示

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

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

请参阅另一个正则表达式演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM