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

150

У меня есть вывод команды в табличной форме. Я анализирую этот вывод из файла результатов и сохраняю его в строке. Каждый элемент в одной строке разделяется одним или несколькими пробелами, поэтому я использую регулярные выражения, чтобы сопоставить 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добавляется в список.

user2763554
источник
1
Я отклонил этот вопрос. Причина в том, что, хотя сам вопрос актуален, данный пример недостаточно сложен, чтобы действительно требовать запрошенного решения. Регулярное выражение потребуется, если у вас есть, например, блоки слов, блоки чисел, и вы хотите разделить их на разные переменные.
erikbwork 03
@erikbwork Я хотел удалить ненужный пробел в результирующей строке'str2'
user2763554 04
2
Да, и вы можете добиться этого, просто используя str1.split(). Нет необходимости в регулярном выражении.
erikbwork 04

Ответы:

180

При использовании (, )вы захватываете группу, если вы просто удалите их , вы не будете иметь эту проблему.

>>> 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
Как я могу использовать это, если у меня есть строка, которая начинается и заканчивается withspace. пример: abc de. Для этого на выходе получается['', 'a', 'b', 'c', 'de', '']
Рахолия Жениш
@RakholiyaJenishstr1.split()
jamylak
@jamylak string.split()- это вариант. Я спрашивал, можно ли это сделать и с регулярным выражением?
Рахолия Жениш
2
@RakholiyaJenish Можете не использовать re.findallвариант?
jamylak
25

str.splitМетод автоматически удаляет все пробелы между элементами:

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

Документы здесь: http://docs.python.org/library/stdtypes.html#str.split

Тревор
источник
1
@ GururajY.S .: str.split()вероятно, лучший выбор для чего-то столь же легкого, как эта.
Joel Cornett
7

Когда вы используете, re.splitа шаблон разделения содержит группы захвата, эти группы сохраняются на выходе. Если вы этого не хотите, используйте вместо этого группу без захвата.

BrenBarn
источник
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()
проклятый