如何在多个分隔符上拆分字符串但只捕获一些?

时间:2016-09-25 19:43:23

标签: python regex

我想在我提供的任何分隔符组合上拆分字符串。例如,如果字符串是:

s = 'This, I think,., کباب MAKES , some sense '

分隔符为\.,\s。但是我想捕获除空格\s之外的所有分隔符。输出应为:

['This', ',', 'I', 'think', ',.,', 'کباب', 'MAKES', ',', 'some', 'sense']

到目前为止,我的解决方案是使用re模块:

pattern = '([\.,\s]+)'  
re.split(pattern, s)

然而,这也捕获了空白。我尝试使用其他模式,例如[(\.)(,)\s]+,但它们不起作用。

编辑:@PadraicCunningham做了一个精明的观察。对于Some text ,. , some more text之类的分隔符,我只想从,. ,中删除前导空格和尾随空格,而不是从空格中删除。

4 个答案:

答案 0 :(得分:5)

以下方法将是最简单的方法,我想......

s = 'This, I think,., کباب MAKES , some sense '
pattern = '([\.,\s]+)'
splitted = [i.strip() for i in re.split(pattern, s) if i.strip()]

输出:

['This', ',', 'I', 'think', ',.,', 'کباب', 'MAKES', ',', 'some', 'sense']

答案 1 :(得分:3)

注意:根据问题的新编辑,我改进了我的旧正则表达式。新的很长,但相信我,这是工作!

我建议将下面的模式作为函数re.split()的分隔符:

(?<![,\.\ ])(?=[,\.]+)|(?<=[,\.])(?![,\.\ ])|(?<=[,\.])\ +(?![,\.\ ])|(?<![,\.\ ])\ +(?=[,\.][,\.\ ]+)|(?<![,\.\ ])\ +(?![,\.\ ])

我的解决方法不需要任何前/后空间修改。使正则表达式工作的关键在于如何使用or对正则表达式进行排序。我的粗略策略是最后评估处理空间领先的任何模式。

请参阅DEMO

其他

根据@ revo的评论,他提供了我的另一个缩短版本

\s+(?=[^.,\s])|\b(?:\s+|(?=[,.]))|(?<=[,.])\b

请参阅DEMO

答案 2 :(得分:0)

根据OP的上次编辑进行更新

Python 3。*:

list(filter(None, re.split('([.,]+(?:\s+[.,]+)*)|\s', s)))

输出:

['This', ',', 'I', 'think', ',.,', 'کباب', 'MAKES', ',', 'some', 'sense']

答案 3 :(得分:0)

我相信这是关于内存的最有效选择,并且在计算时间方面非常有效:

import re
from itertools import chain
from operator import methodcaller

input_str = 'This, I think,., ???? MAKES , some sense '

iterator = filter(None,  # Filter out all 'None's
                  chain.from_iterable(  # Flatten the tuples into one long iterable
                    map(methodcaller("groups"),  # Take the groups from each match.
                        re.finditer("(.*?)(?:([\.,]+)|\s+|$)", input_str))))

# If you want a list:
list(iterator)