Разбейте строку вокруг пробелов без двоеточий - PullRequest
2 голосов
/ 09 мая 2019

У меня проблема с разделением строк, если между двумя строками больше одного пробела . Но условие состоит в том, что ряд пробелов не должен следовать за двоеточием (:) или предшествовать ему (как в случае (C) и (D)). Follwing - это регулярное выражение, которое я использую:

    str_ = re.split(r'(.+?)(?!<\:)(\s\s+)(?!\:)(.+)',text), 

где текст может быть любым из следующих примеров: например:

    foo1:bar1   foo2:bar2      (A)#O/P should be [foo1:bar1,foo2:bar2]
    foo1:bar1                  (B)#O/P should be [foo1:bar1]
    foo1    :bar1   foo2:bar2  (C)#O/P should be [foo1    :bar1,foo2:bar2]
    foo1    :bar1              (D)#O/P should be [foo1    :bar1]

Например, (C) и (D) я получаю раскол, тогда как этого не должно быть. Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Вы можете использовать

re.split(r'(?<![\s:])\s{2,}(?![\s:])', s)

Детали

  • (?<![\s:]) - без пробелов или : разрешено непосредственно слева от текущего местоположения
  • \s{2,} - два или более пробелов (более короткий вариант \s\s+)
  • (?![\s:]) - без пробелов или : разрешено непосредственно справа от текущего местоположения.

См. regex demo (\s заменено пробелом для демонстрационных целей).

Демо Python :

import re
strs = ['foo1:bar1   foo2:bar2', 'foo1:bar1', 'foo1    :bar1   foo2:bar2', 'foo1    :bar1', 'f   :fdfd   f:f', 'f:   fdfd   f:f']
for s in strs:
    print(re.split(r'(?<![\s:])\s{2,}(?![\s:])', s))

Выход:

['foo1:bar1', 'foo2:bar2']
['foo1:bar1']
['foo1    :bar1', 'foo2:bar2']
['foo1    :bar1']
['f   :fdfd', 'f:f']
['f:   fdfd', 'f:f']
1 голос
/ 09 мая 2019

Я рекомендую просто использовать re.findall здесь:

input = "foo1    :bar1   foo2:bar2"
result = re.findall(r'\S+\s*:\s*\S+', input)
print(result)

['foo1    :bar1', 'foo2:bar2']

Упрощенный шаблон регулярного выражения соответствует:

\S+  one or more non whitespace characters
\s*  which are followed by optional whitespace
:    followed by a colon and
\s*  more optional whitespace
\S+ one or more non whitespace characters
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...