我在做
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']
,也就是说,多个定界符分开出现,而我希望它们汇总在一起。)
答案 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]
替换以匹配任何标点符号(除空格字符之外的任何非单词字符)。