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


143

У мене є вихід команди в табличній формі. Я аналізую цей вихід із результативного файлу і зберігаю його у рядку. Кожен елемент в одному рядку відокремлений одним або декількома символами пробілу, тому я використовую регулярні вирази, щоб відповідати 1 або більше пробілів і розділити його. Однак між кожним елементом вставляється пробіл:

>>> str1="a    b     c      d" # spaces are irregular
>>> str1
'a    b     c      d'
>>> str2=re.split("( )+", str1)
>>> str2
['a', ' ', 'b', ' ', 'c', ' ', 'd'] # 1 space element between!!!

Чи є кращий спосіб зробити це?

Після кожного розбиття str2додається до списку.


1
Я спростував це питання. Причина полягає в тому, що, хоча саме питання є актуальним, даний приклад не є достатньо важким, щоб справді вимагати потрібного рішення. Регекс знадобиться, якщо у вас є, наприклад, блоки слів, блоки чисел і ви хочете розділити їх на різні змінні.
erikbwork

@erikbwork Я хотів видалити небажаний пробіл у результативному рядку'str2'
user2763554

1
Так, і ви можете досягти цього просто використанням str1.split(). Не потрібно регексу.
erikbwork

Відповіді:


176

Використовуючи (, )ви захоплюєте групу, якщо ви просто видалите їх, у вас не виникне цієї проблеми.

>>> str1 = "a    b     c      d"
>>> re.split(" +", str1)
['a', 'b', 'c', 'd']

Однак немає необхідності в регулярному вираженні, str.splitбез вказаного роздільника це розділить це на пробіл. Це було б найкращим чином у цьому випадку.

>>> str1.split()
['a', 'b', 'c', 'd']

Якщо ви дійсно хотіли регулярного виразу, ви можете скористатися цим ( '\s'представляє пробіл і зрозуміліше):

>>> re.split("\s+", str1)
['a', 'b', 'c', 'd']

або ви можете знайти всіх символів, які не пробілюються

>>> re.findall(r'\S+',str1)
['a', 'b', 'c', 'd']

4
Не ускладнювати. str.splitнапевно найкраще: D
jamylak

Як я можу це використати, якщо у мене є рядок, яка починається і закінчується пробілом. приклад: 'abc de'. Для цього вихід виходить як['', 'a', 'b', 'c', 'de', '']
Рахолія Дженіш

@RakholiyaJenishstr1.split()
jamylak

@jamylak string.split()- це варіант. Я запитав, чи можна це зробити і з регулярним виразом?
Рахолія Дженіш

2
@RakholiyaJenish Не можете використовувати re.findallваріант?
jamylak


7

Коли ви використовуєте, re.splitі шаблон розбиття містить групи захоплення, групи зберігаються у висновку. Якщо ви цього не хочете, використовуйте натомість групу, яка не захоплює.


2
Використовувати str.split, мабуть, краще для вашого прикладу. Я просто хотів пояснити, чому ви отримуєте свою поведінку.
BrenBarn

2

Насправді це дуже просто. Спробуйте це:

str1="a    b     c      d"
splitStr1 = str1.split()
print splitStr1

2
Я б поставив +1 цьому, але ви використовуєте потворні напівколонки.
jamylak

3
@jamylak Lol. Я їх зміню. :) Звичка використовувати java та python!
проклятий

1
@ GururajY.S. Якщо ви просто хочете розділити на основі місця, просто скористайтесяstringToSplit.split()
проклятий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.