我想在我提供的任何分隔符组合上拆分字符串。例如,如果字符串是:
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
之类的分隔符,我只想从,. ,
中删除前导空格和尾随空格,而不是从空格中删除。
答案 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)