在大写字母之前插入空格的pythonic方式

Ele*_*hoy 21 python regex text-files

我有一个文件,我的格式是通过python脚本改变的.我在这个文件中有几个camel cased字符串,我只想在大写字母之前插入一个空格 - 所以"WordWordWord"变成"Word Word Word".

我有限的正则表达式经验只是让我感到困惑 - 有人可能会想到一个像样的正则表达式,或者(更好的是)是否有更多的pythonic方法来做到这一点,我错过了?

Gre*_*ill 37

你可以尝试:

>>> re.sub(r"(\w)([A-Z])", r"\1 \2", "WordWordWord")
'Word Word Word'
Run Code Online (Sandbox Code Playgroud)

  • @Tomalak,Python不支持`[[:upper:]]`.它是[POSIX括号表达式](http://www.regular-expressions.info/posixbrackets.html). (5认同)
  • re.sub(r“(\ w)([AZ])”,r“ \ 1 \ 2”,“ SorryIThinkYouMissedASpot”) (2认同)
  • 对于像我这样的人,请确保您 - import re (2认同)

小智 27

如果有连续的大写字母,那么Gregs结果可能不是你想要的,因为\ w消耗了要替换的字母前面的字符.

>>> re.sub(r"(\w)([A-Z])", r"\1 \2", "WordWordWWWWWWWord")
'Word Word WW WW WW Word'
Run Code Online (Sandbox Code Playgroud)

后视可以解决这个问题:

>>> re.sub(r"(?<=\w)([A-Z])", r" \1", "WordWordWWWWWWWord")
'Word Word W W W W W W Word'
Run Code Online (Sandbox Code Playgroud)


tzo*_*zot 10

也许更短:

>>> re.sub(r"\B([A-Z])", r" \1", "DoIThinkThisIsABetterAnswer?")
Run Code Online (Sandbox Code Playgroud)

  • 对于任何想知道的人来说,`\B` 是“不是字边界”。所以它不会在已有空格的地方插入空格。 (2认同)

Mar*_*rot 9

看看我对.NET的回答- 如何将"大写"分隔的字符串拆分成数组?

编辑:也许最好将其包含在这里.

re.sub(r'([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))', r'\1 ', text)
Run Code Online (Sandbox Code Playgroud)

例如:

"SimpleHTTPServer" => ["Simple", "HTTP", "Server"]
Run Code Online (Sandbox Code Playgroud)


Dan*_*ski 5

使用正则表达式,您可以执行以下操作:

re.sub('([A-Z])', r' \1', str)
Run Code Online (Sandbox Code Playgroud)

当然,这仅适用于 ASCII 字符,如果你想做 Unicode,那就是一个全新的蠕虫罐头:-)

  • re.sub('([AZ])', r' \1', "我们想要在这个短语的 D 之前有一个空格吗?") (2认同)

Yar*_*kov 5

也许您对不使用regexp的单行实施感兴趣:

''.join(' ' + char if char.isupper() else char.strip() for char in text).strip()
Run Code Online (Sandbox Code Playgroud)