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


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добавляется в список.


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


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.