在空格之间分割字符串,中间不加冒号

时间:2019-05-09 10:37:26

标签: python regex python-2.7 regex-lookarounds

我有一个问题,如果两个字符串之间有个以上空格,则必须拆分字符串。但条件是,一系列空格不应跟随冒号(:)或位于冒号之前(例如(C)和(D)情况)。我正在使用的正则表达式是:

    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 个答案:

答案 0 :(得分:1)

我建议仅在此处使用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

答案 1 :(得分:1)

您可以使用

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

详细信息

  • (?<![\s:])-当前位置左侧不允许有空格或:
  • \s{2,}-两个或多个空格(\s\s+的较短变体)
  • (?![\s:])-当前位置的右侧不允许有空格或:

请参见regex demo(出于演示目的,\s被替换为空格)。

Python demo

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']