【问题标题】:Regex: Set together single characters as long as they are letters正则表达式:将单个字符组合在一起,只要它们是字母
【发布时间】:2020-01-17 18:32:25
【问题描述】:

考虑以下示例:

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

谢谢

【问题讨论】:

  • 把每一个\w改成[a-zA-Z]是否有效?
  • 看起来您希望将 \b([a-zA-Z])[\s-]+(?=[a-zA-Z]\b) 替换为 \1 (demo)。

标签: python regex regex-lookarounds


【解决方案1】:

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

这意味着您不需要寻找(?!\w\w)。相反,在这种情况下,您会寻找 (?=\w\b) 或特别是 (?=[a-zA-Z]\b)

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

把它们放在一起:

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

live demo here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多