【问题标题】:How do I insert space before capital letter if and only if previous letter is not capital?当且仅当前一个字母不是大写时,如何在大写字母之前插入空格?
【发布时间】:2019-06-06 14:28:27
【问题描述】:

我有文字:

'SMThingAnotherThingBIGCapitalLetters'

我希望输出是:

'SM Thing Another Thing BIG Capital Letters'

我现在的正则表达式:

r"(\w)([A-Z])", r"\1 \2"

当我没有两个大写字母彼此靠近时,此方法有效。

我的正则表达式的输出:

'S MThing Another Thing B I G Capital Letters'

所以,当下一个字母很小时,我需要正则表达式在大写字母之前插入一个空格。

有人有想法吗?

【问题讨论】:

  • r"([^A-Z])([A-Z])", r"\1 \2"?或者,r"([^\WA-Z])([A-Z])", r"\1 \2"?
  • 必须使用正则表达式吗?一个简单的文本循环可能更容易理解和维护。
  • \B(?=[A-Z][a-z])|(?<=[a-z])\B(?=[A-Z]) 怎么样,用空格代替。
  • 考虑到当下一个字母很小时,我需要正则表达式在大写字母前插入一个空格您的实际目标,SMThingAnotherThingBIGCapitalLetters 将是:SM Thing Another ThingBIG Capital Letters。这是你的目标吗?
  • Thing 之前为什么要加空格? IS 前面的字母大写(即M

标签: python regex


【解决方案1】:

您应该谨慎使用正则表达式。他们很容易变成无人能理解的巨大怪物。你可以用简单的循环而不是正则表达式来解决你的问题:

a = 'SMThingAnotherThingBIGCapitalLetters'
result = a[0]

for i, letter in enumerate(a):
    if letter.isupper() and (result[-1].islower() or a[i+1].islower()):
        result += ' '
    if i: result += letter
result

'SM Thing Another Thing BIG Capital Letters'

【讨论】:

  • 谢谢!我忘了.isupper/islower()!简化代码。
  • OP 谈到了当下一个字母很小时在大写字母前插入一个空格。那么,为什么要Thing BIG
  • 看看 OPs ,我希望输出是: 字符串。和我的一样。
【解决方案2】:

您可以对 2 个捕获组使用交替并替换为 group1 group2 space,例如 r"\1\2 "

([A-Z])(?=[A-Z][a-z])|([a-z])(?=[A-Z])

说明

  • ([A-Z])在第1组捕获大写的A-Z
  • (?=[A-Z][a-z])正向前瞻,断言右边是一个大写和一个小写a-z
  • |或者
  • ([a-z]) 捕获第 2 组中的小写 a-z
  • (?=[A-Z]) 正向前瞻,断言右边是大写的 A-Z

Regex demo

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多