首页 > 解决方案 > 在多个分隔符上拆分字符串,但不单独在空格上

问题描述

我正在做

delimiters = [r'\r\n', r'\.\.\.', r'\W']
pattern = regex.compile(r'(' + r'|'.join(delimiters) + r')', flags=regex.V1)
pattern.split(s)

在多个分隔符上拆分s(使用括号在输出中保留分隔符)。

当它单独发生时,如何防止在空白处分裂?例如,

'abc, def , geh,, , ijk      lmn \n opq'

应该给

`['abc', ', ', 'def', ' , ', 'geh', ',, , ', 'ijk      lmn', ' \n ', 'opq']

也就是说,当空白与另一个分隔符一起出现时,应该执行拆分,但当标记之间只有空白时则不执行。空格我真的只是指空格'',而不是任何其他标记,例如换行符.s

(这实际上是两个问题,正如我现在得到['abc', ',', '', ' ', 'def', ' ', 'geh']的那样,即多个分隔符分别出来,而我希望它们聚合出来。)

标签: pythonregex

解决方案


使用regex模块,您可以使用:

import regex
arr = ['abc,, def', 'abc, def geh', 'abc  def', 'abc, def , geh,, , ijk      lmn \n opq']
res = [regex.split(r'\b(?=\W)(?! +\b)|(?<=\b\W*[^\w ]+\W*\b)',x) for x in arr]
print(res)

印刷:

[['abc', ',, ', 'def'], ['abc', ', ', 'def geh'], ['abc  def'], ['abc', ', ', 'def', ' , ', 'geh', ',, , ', 'ijk      lmn', ' \n ', 'opq']]

模式匹配:

  • \b- 单词边界。
  • (?=\W)- 非单词字符的积极前瞻。
  • (?!\s\b)- 空格字符和单词边界的负前瞻。
  • |- 或者
  • (?<=\b\W*[^\w\s]+\W*\b)- 对单词边界、零个或多个非单词字符、至少一个除单词字符或空白字符以外的字符进行正向回溯,如果可能,后跟(贪婪的)非单词字符和单词边界。

推荐阅读