正则表达式:将单个字符组合在一起,只要它们是字母

Regex: Set together single characters as long as they are letters

考虑以下示例:

Original                       Regex
A-B-C SCHOOL INSTITUTION   --> ABC SCHOOL INSTITUTION
A B C SCHOOL INSTITUTION   --> ABC SCHOOL INSTITUTION

目的是将用连字符或空格分隔的单个字母组合在一起。我使用了以下模式:

(?<!\w\w)(?:\s+|-)(?!\w\w)

但是,我有一个问题,就是不能对数字应用相同的规则,因为 \w 包含数字,所以出现了这个问题。例如,以下内容是不允许的,应按原样保持分隔:

Original                   Regex                    Desired
A 5 M SCHOOL CORPORATION   A5M SCHOOL CORPORATION   A 5 M SCHOOL CORPORATION

谢谢

首先这个(?:\s+|-)可以缩短为[\s-]+[ -]+。其次,你需要的是白名单而不是黑名单。

这意味着您不查找 (?!\w\w)。相反,您要查找 (?=\w\b) 或在这种情况下具体查找 (?=[a-zA-Z]\b)

最后,您不想匹配数字。所以你需要在匹配任何[ -]之前排除它们:(?<!\d)[ -]+.

综合起来:

re.sub(r'(?<!\d)[ -]+(?=[a-zA-Z]\b)', '', str)

live demo here