使用正则表达式查找缩写
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。
我正在尝试创建一个正则表达式来识别 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。