Регулярное выражение Python: Превратите «ThisFileName.txt» в «Этот файл Name.txt» - PullRequest
2 голосов
/ 05 февраля 2009

Я пытаюсь добавить пробел перед каждой заглавной буквой, кроме первой.

Вот что у меня есть, и результат, который я получаю:

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

Я хочу: 'This File Name.txt'

(Было бы неплохо, если бы я мог также избавиться от .txt, но я могу сделать это в отдельной операции.)

Ответы [ 4 ]

9 голосов
/ 05 февраля 2009

Ключевым понятием здесь являются обратные ссылки в регулярных выражениях:

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 голосов
/ 05 февраля 2009

Другое возможное регулярное выражение, использующее взгляд позади:

(?<!^)([A-Z])
2 голосов
/ 05 февраля 2009
re.sub('([a-z])([A-Z])', '\\1 \\2', 'TheFileName.txt')

РЕДАКТИРОВАТЬ: StackOverflow ест некоторые \ s, когда не в «режиме кода» ... Поскольку я забыл добавить новую строку после кода выше, он не был интерпретирован в «режиме кода»: - ((. этот текст мне не нужно было ничего менять, и теперь он правильный.

1 голос
/ 06 февраля 2009

Непонятно, что вы хотите сделать, если имя файла - 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...