在多个定界符上分割字符串,但不能单独在空白上

时间:2020-07-20 14:46:50

标签: python regex

我在做

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

也就是说,当空白与另一个定界符一起出现时,应该执行分割,但是当标记之间只有空白时不应该执行分割。空格我实际上只表示空格'',而不是其他标记(例如换行符)。

(这实际上是两个问题,因为现在我得到['abc', ',', '', ' ', 'def', ' ', 'geh'],也就是说,多个定界符分开出现,而我希望它们汇总在一起。)

2 个答案:

答案 0 :(得分:4)

通过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)-对单词边界,零个或多个非单词字符,单词字符或空格字符以外的至少一个字符以及可能的(贪婪的)非单词字符进行正向后看字边界。

答案 1 :(得分:3)

您可以使用

import re
delimiters = [r'\r\n', r'\.\.\.', r'[^\w\s]']
d = r"|".join(delimiters)
pattern = re.compile(rf'((?:\s*(?:{d}))+\s*)')
s = 'abc, def , geh,, , ijk      lmn'
print( pattern.split(s) )
# => ['abc', ', ', 'def', ' , ', 'geh', ',, , ', 'ijk      lmn']

请参见Python demo

请参阅regex demo的含义

  • (?:\s*(?:\r\n|\.\.\.|[^\w\s]))+-以下一项或多项重复:
    • \s*-超过0个空格
    • (?:\r\n|\.\.\.|[^\w\s])-您的分隔符模式之一
  • \s*-超过0个空格

请注意,\W[^\w\s]替换以匹配任何标点符号(除空格字符之外的任何非单词字符)。