Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在大写字母前插入空格的一种python方法_Python_Regex_Text Files - Fatal编程技术网

在大写字母前插入空格的一种python方法

在大写字母前插入空格的一种python方法,python,regex,text-files,Python,Regex,Text Files,我有一个文件,我正在通过python脚本修改它的格式。我在这个文件中有几个驼峰大小写的字符串,我只想在大写字母前插入一个空格,这样“wordword”就变成了“Word” 我有限的regex体验让我陷入了困境——有人能想出一个像样的regex来做这件事吗,或者(更好的是)有没有一种更像Python的方式来做这件事,而我却错过了?你可以试试: >>> re.sub(r"(\w)([A-Z])", r"\1 \2", "WordWordWord") 'Word Word Word'

我有一个文件,我正在通过python脚本修改它的格式。我在这个文件中有几个驼峰大小写的字符串,我只想在大写字母前插入一个空格,这样“wordword”就变成了“Word”

我有限的regex体验让我陷入了困境——有人能想出一个像样的regex来做这件事吗,或者(更好的是)有没有一种更像Python的方式来做这件事,而我却错过了?

你可以试试:

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

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

re.sub('([A-Z])', r' \1', str)

当然,这只适用于ASCII字符,如果您想使用Unicode,这将是一个全新的蠕虫:-)

如果有连续的大写字母,那么Gregs结果可能会出现 不是您想要的,因为\w使用字符 在要替换的大写字母前面

>>> re.sub(r"(\w)([A-Z])", r"\1 \2", "WordWordWWWWWWWord")
'Word Word WW WW WW Word'
回头看看就能解决这个问题:

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

请看一下我的答案

编辑:最好在此处包含它

re.sub(r'([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))', r'\1 ', text)
例如:

"SimpleHTTPServer" => ["Simple", "HTTP", "Server"]
也许更短:

>>> re.sub(r"\B([A-Z])", r" \1", "DoIThinkThisIsABetterAnswer?")

我同意regex解决方案是最简单的,但我不会说它是最具python风格的

那么:

text = 'WordWordWord'
new_text = ''

for i, letter in enumerate(text):
    if i and letter.isupper():
        new_text += ' '

    new_text += letter

我认为正则表达式是解决这个问题的方法,但我只是想给出一个纯python版本,而不(希望)有任何问题

def splitCaps(s):
    result = []
    for ch, next in window(s+" ", 2):
        result.append(ch)
        if next.isupper() and not ch.isspace():
            result.append(' ')
    return ''.join(result)
window()是一个实用函数,我用来操作项目的滑动窗口,定义如下:

import collections, itertools

def window(it, winsize, step=1):
    it=iter(it)  # Ensure we have an iterator
    l=collections.deque(itertools.islice(it, winsize))
    while 1:  # Continue till StopIteration gets raised.
        yield tuple(l)
        for i in range(step):
            l.append(it.next())
            l.popleft()

也许您会对不使用regexp的一个线性实现感兴趣:

''.join(' ' + char if char.isupper() else char.strip() for char in text).strip()

如果您有首字母缩写词,您可能不希望它们之间有空格。此两阶段正则表达式将保持首字母缩写词的完整性(并将标点符号和其他非大写字母视为添加空格的内容):

re_outer=re.compile(r'([^A-Z])([A-Z]))

re_inner=re.compile(r’(?)到旧线程-想要尝试一个选项来满足我的一个需求。当然,
re.sub()
是一个很酷的解决方案,但是如果没有(或不应该)导入re模块,它也会得到一个1行程序

st='ThisIsTextStringToSplitWithSpace'
打印(“”.join([“”+s,如果s.isupper()则为s,否则为s,在st中为s]).lstrip())

Dan的答案更好更简单:)@hayalci:re.sub(“([A-Z]),r'\1',“真的吗?”)re.sub(“([A-Z]),r'\1',“我们想在这个短语的D之前留一个空格吗?”)啊,是的,很好的观点。看起来你和Leonhard的解决方案正确地处理了这个问题。re.sub(r)(\w)([A-Z]),r“\1\2”,“Sorryinkyoudaspot”)作为一个小改进,[:upper:]]应使用而不是[A-Z]。@Tomalak,
[:upper:]
不受Python支持。这是一个很好的答案。对于像我这样的人,请确保你-你的答案可能是Electronics\u Ahoy真正想要的;但是,根据他们问题的措辞,答案不是。但感谢你分享这个答案,这是一个很棒的答案!这与Dan的问题相同-你甚至可以在使用大写字母之前获得额外的空格如果不需要的话。是的,我编辑了它来添加一个标志…我承认这有点麻烦,但可能比正则表达式更容易记住。对于任何想知道,
\B
是“非单词边界”。所以它不会在已经有空格的地方插入空格。优雅的回答…非常感谢
re_outer = re.compile(r'([^A-Z ])([A-Z])')
re_inner = re.compile(r'(?<!^)([A-Z])([^A-Z])')
re_outer.sub(r'\1 \2', re_inner.sub(r' \1\2', 'DaveIsAFKRightNow!Cool'))