Разделенная строка Python на основе регулярного выражения

115

Как лучше всего разбить строку, например "HELLO there HOW are YOU", прописными словами (в Python)?

Итак, я бы получил такой массив: results = ['HELLO there', 'HOW are', 'YOU']


РЕДАКТИРОВАТЬ:

Я пытался:

p = re.compile("\b[A-Z]{2,}\b")
print p.split(page_text)

Хотя, похоже, это не работает.

Toto
источник
2
Что ты пробовал ? - Не смогли найти re.split()?
Гарет Латти
5
Когда вы говорите, что что-то не работает, вы должны объяснить, почему. У вас есть исключение? (Если да, опубликуйте исключение целиком) Вы получили неправильный результат?
Гарет Латти

Ответы:

134

Я предлагаю

l = re.compile("(?<!^)\s+(?=[A-Z])(?!.\s)").split(s)

Посмотрите эту демонстрацию .

Ωmega
источник
5
что происходит, когда вы не используете компиляцию?
Feelsbadman
3
Согласно повторным документам , « большинство операций с регулярными выражениями доступны как функции уровня модуля и методы RegexObject. Эти функции представляют собой ярлыки, которые не требуют предварительной компиляции объекта регулярного выражения, но пропускают некоторые параметры точной настройки ». Вы можете использовать re.split(re.split(pattern, string, maxsplit=0, flags=0))как упоминалось в ранее цитированных документах.
ZaydH
57

Вы можете использовать просмотр вперед:

re.split(r'[ ](?=[A-Z]+\b)', input)

Это разделится на каждый пробел, за которым следует строка заглавных букв, заканчивающаяся границей слова.

Обратите внимание, что квадратные скобки предназначены только для удобства чтения и могут быть опущены.

Если достаточно, чтобы первая буква слова была в верхнем регистре (так что если вы также захотите разделить перед Helloней), это станет еще проще:

re.split(r'[ ](?=[A-Z])', input)

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

Мартин Эндер
источник
1
Как мне изменить, re.split(r'[ ](?=[A-Z]+\b)', input)чтобы он не находил заглавные буквы? Например, это не соответствует «А»? Я пробовал re.split(r'[ ](?=[A-Z]{2,}+\b)', input). Спасибо!
@JamesEggers Вы имеете в виду, что хотите, чтобы вам потребовалось как минимум две заглавные буквы, чтобы не разбивать слова вроде I? re.split(r'[ ](?=[A-Z]{2,}\b)', input)должен это сделать.
Мартин Эндер
2
Я бы посоветовал хотя бы, [ ]+а может быть, даже \W+поймать чуть больше дел. Тем не менее, хороший ответ.
georg 03
Я пробовал тот же подход. Однако [ ]у меня не получилось. Вместо этого я использовал \s. Полное регулярное выражение, которое сработало для меня, былоre.split("\s(?=[A-Z]+\s)", string)
h3xh4wk
0

Ваш вопрос содержит строковый литерал "\b[A-Z]{2,}\b", но это \bбудет означать возврат, потому что нет r-модификатора.

Попробуйте: r"\b[A-Z]{2,}\b".

друид62
источник