2016-06-27 24 views
1

只有一次我有一个字符串的结构是这样的:如何通过标签来分割字符串,但每次发生

"I\thave\ta\t\tstring" 

而且为了通过选项卡拆分我用这个方法:

text = [splits for splits in row.split("\t") if splits is not ""] 

现在这方法删除字符串中的所有选项卡,但我希望它只删除一个单词后第一个出现的选项卡,因此它最终将如下所示:

"Ihavea\tstring" 

有没有办法做到这一点?

回答

2

背后断言负看看使用re.split应该做的:

import re 

s = ''.join(re.split(r'(?<!\t)\t', row)) 
print(s) 
# 'Ihavea\tstring' 

断言(?<!\t)防止在其上之前由另一\t一个\t分裂。

您可以使用re.sub如果你实际上并不需要从拆分项目:

s = re.sub(r'(?<!\t)\t', '', row) 
print(s) 
# 'Ihavea\tstring' 
+0

完美地工作,谢谢! –

1

为了简单起见,你可以使用re.split

from re import split 
text = "I\thave\ta\t\tstring" 
split_string = split(r'\t+', text) #Gives ['I', 'have', 'a', 'string'] 

正则表达式r'\t+'基本上只是集团所有连续标签在一起。

+0

请记住,这是严格分割字符串。你可以很容易地用'“”join加入(split_string)' –

+0

我承认@MosesKoledoye有一个更好的答案,因为我的答案只是删除所有的标签将分裂他们,他将保留一个,如果有多个。 –

2

列表理解也是很长的路要走,如果你想避免导入re模块:

row = "I\thave\ta\t\tstring" 
text = [splits if splits else "\t" for splits in row.split("\t")] 
"".join(text) 
#'Ihavea\tstring' 

空字符串是在布尔上下文假和空列表元素会为每个连续的分裂而产生-char(在这种情况下为“\ t”)