Розбитий рядок 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)

Це, здається, не працює.


2
Що ви пробували ? - Ти не зміг знайти re.split()?
Гарет Летті

5
Коли ви говорите, що щось не працює, ви повинні пояснити, чому. Ви отримуєте виняток? (Якщо так, опублікуйте весь виняток) Ви отримали неправильний висновок?
Гарет Латті

Відповіді:


134

я пропоную

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

Перевірте цю демонстрацію .


5
що відбувається, коли ви не використовуєте компіляцію?
Feelsbadman

3
Згідно з повторними документами , " більшість операцій регулярного вираження доступні у вигляді функцій на рівні модулів та методів RegexObject. Функції - це ярлики, які не вимагають, щоб ви спершу збирали об'єкт регулярного виразів, але пропускали деякі параметри тонкої настройки. " re.split(re.split(pattern, string, maxsplit=0, flags=0))як згадувалося в цитованих раніше документах.
ЗайдХ

57

Ви можете використовувати lookahead:

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

Це розділиться на кожному просторі, за яким слідує рядок великих літер, які закінчуються на межі слова.

Зауважте, що квадратні дужки призначені лише для читання і можуть бути опущені.

Якщо достатньо, щоб перша літера слова була великою літерою (тому, якщо ви хочете розділити перед собою Hello), стає ще простіше:

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

Тепер це розділяється на кожному просторі, за яким слід будь-яка велика літера.


1
Як я можу змінити, re.split(r'[ ](?=[A-Z]+\b)', input)щоб він не знайшов великих літер? Наприклад, це не відповідатиме "A"? Я спробував re.split(r'[ ](?=[A-Z]{2,}+\b)', input). Дякую!

@JamesEggers Ви маєте на увазі, що вам потрібно вимагати принаймні дві великі літери, щоб ви не розділилися на слова типу I? re.split(r'[ ](?=[A-Z]{2,}\b)', input)повинен це зробити.
Мартін Ендер

2
Я б запропонував хоча б [ ]+або, можливо, навіть \W+зловити трохи більше справ. Все-таки хороша відповідь.
georg

Я спробував той же підхід. Тим не менш, мати [ ]не працювало для мене. Натомість я використав \s. Повний regexp, який працював на мене, бувre.split("\s(?=[A-Z]+\s)", string)
h3xh4wk

0

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.