2013-09-08 4 views
2

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

string1 = "abcd efgh a. abcd b efgh" 
    print re.findall(r"[\w.]+") 

, как и ожидалось, результаты:

['abcd', 'efgh', 'a.', 'abcd', 'b', 'efgh'] 

Однако, я хотел бы группа «а. ' и «abcd» в одну группу, а «b» и «efgh» - в одну группу. Так что результат я хочу, будет выглядеть примерно так:

['abcd', 'efgh', 'a. abcd', 'b efgh'] 

Мой подход в настоящее время является создание двух типов выражения. Первый имеет дело с регулярным выражением без пространства, то есть «abcd» и «efgh». Второй - иметь дело с одним пространством. то есть «а». + 'abcd'.

Так что если г '[\ ш] + может иметь дело с первым типом, и г' [\ ш] + [\ ш] + может иметь дело со вторым типом. Но я не знаю, как объединить их в одно и то же выражение, используя '|'.

Как всегда, любые другие подходы приветствуются. И спасибо за ваше время!

+0

Split by '\ s \ s +' – gukoff

ответ

8
result = [s.strip() for s in string1.split(' ') if s.strip()] 

т.е. расщепление на два пространств и удаление лишних пробелов из результата (с использованием полосы).

4

Если вы хотите использовать re.findall, вы можете использовать это выражение:

>>> string1 = "abcd efgh a. abcd b efgh" 
>>> print re.findall(r"\S+(?:\s\S+)*", string1) 
['abcd', 'efgh', 'a. abcd', 'b efgh'] 

(?:\S+(?:\s\S+)*) находит нон пробела, за которым следует один пробел и более символов без пробелов несколько раз, если они существуют, так что это тоже работает:

>>> string1 = "abcd efgh a. abcd b efgh ijkl" 
>>> print re.findall(r"\S+(?:\s\S+)*", string1) 
['abcd', 'efgh', 'a. abcd', 'b efgh ijkl'] 

в противном случае, это гораздо проще использовать разделение более чем на 2 зоны:

>>> string1 = "abcd efgh a. abcd b efgh ijkl" 
>>> print re.split(r"\s{2,}", string1) 
['abcd', 'efgh', 'a. abcd', 'b efgh ijkl'] 
+0

Почему не только '' re.findall ("\ S + (?: \ S \ S +) *") ''? Кроме того, сырая строка здесь совершенно бесполезна, так как все обратные косые черты намерены интерпретироваться как метасимволы компилятором re, а не простые символы обратной косой черты. – eyquem

+0

@eyquem Поскольку 're.findall()' принимает от 2 до 3 аргументов? Вы пытались запустить 're.findall (" \ S + (?: \ S \ S +) * ")'? Если да, я получаю сообщение об ошибке. И использование исходной строки - привычка, поэтому ошибки избегаются, когда обратные косые черты нужно интерпретировать иначе. – Jerry

+0

Я, очевидно, забыл написать второй аргумент: '' re.findall ("\ S + (?: \ S \ S +) *", string1) '' – eyquem