代码之家  ›  专栏  ›  技术社区  ›  Jim

python regex:将“this file name.txt”转换为“this file name.txt”

  •  2
  • Jim  · 技术社区  · 16 年前

    我想在每个大写字母前加一个空格,除了第一个。

    以下是我目前的情况,以及我得到的输出:

    >>> tex = "ThisFileName.txt"
    >>> re.sub('[A-Z].', ' ', tex)
    ' his ile ame.txt'
    

    我想要: '此文件名.txt'

    (如果我也能去掉.txt,那就太好了,但我可以在单独的操作中完成。)

    4 回复  |  直到 16 年前
        1
  •  9
  •   Kenan Banks    16 年前

    这里的关键概念是正则表达式中的回溯引用:

    import re
    text = "ThisFileName.txt"
    print re.sub('([a-z])([A-Z])', r'\1 \2', text)
    # Prints: "This File Name.txt"
    

    为了可靠地提取“.txt”,我建议 os.path.splitext()

    import os
    filename = "ThisFileName.txt"
    print os.path.splitext(filename)
    # Prints: ('ThisFileName', '.txt')
    
        2
  •  2
  •   Gumbo    16 年前

    另一个可能的正则表达式使用了look-behind:

    (?<!^)([A-Z])
    
        3
  •  2
  •   Johannes Weiss    16 年前
    re.sub('([a-z])([A-Z])', '\\1 \\2', 'TheFileName.txt')
    

    编辑:stackoverflow在不处于“代码模式”时会吃一些\s…因为我忘记在上面的代码后面添加新行,所以它没有在“代码模式”中被解释为':-(。因为我在这里添加了文本,所以我不需要更改任何内容,现在它是正确的。

        4
  •  1
  •   tzot    16 年前

    如果文件名是 Hello123There.txt . 因此,如果您想在所有大写字母之前留出一个空格,不管它们之前是什么,您可以:

    import re
    
    def add_space_before_caps(text):
        "Add a space before all caps except at start of text"
        return re.sub(r"(?<!^)(?=[A-Z])", " ", text)
    
    >>> add_space_before_caps("Hello123ThereIBM.txt")
    'Hello123 There I B M.txt'