2016-11-21 49 views
-1

我想分割使用多个分隔符的字符串。我需要将分隔符保留为单词。 我使用的分隔符是:所有标点符号和空格。Python拆分字符串并将分隔符保存为一个词

例如,字符串:

Je suis, FOU et toi ?! 

应该产生:

'Je' 
'suis' 
',' 
'FOU' 
'et' 
'toi' 
'?' 
'!' 

我写道:

class Parser : 
    def __init__(self) : 
     """Empty constructor""" 

    def read(self, file_name) : 
     from string import punctuation 
     with open(file_name, 'r') as file : 
      for line in file : 
       for word in line.split() : 
        r = re.compile(r'[\s{}]+'.format(re.escape(punctuation))) 
        print(r.split(word)) 

但我得到的结果是:

['Je'] 
['suis', ''] 
['FOU'] 
['et'] 
['toi'] 
['', ''] 

拆分似乎是正确的,但结果列表中不包含分隔符:(

回答

2

您需要将表达式放入组re.split()以保留它。我不会先分割空白。您以后可以随时删除仅限空白字符串。如果希望每个标点符号独立那么你应该使用+量词仅在\s空白组:

# do this just once, not in a loop 
pattern = re.compile(r'(\s+|[{}])'.format(re.escape(punctuation))) 

# for each line 
parts = [part for part in pattern.split(line) if part.strip()] 

列表内涵删除任何东西,只包含空格的:

>>> import re 
>>> from string import punctuation 
>>> line = 'Je suis, FOU et toi ?!' 
>>> pattern = re.compile(r'(\s+|[{}])'.format(re.escape(punctuation))) 
>>> pattern.split(line) 
['Je', ' ', 'suis', ',', '', ' ', 'FOU', ' ', 'et', ' ', 'toi', ' ', '', '?', '', '!', ''] 
>>> [part for part in pattern.split(line) if part.strip()] 
['Je', 'suis', ',', 'FOU', 'et', 'toi', '?', '!'] 

而不是拆分,还可以使用re.findall()查找所有单词标点符号:

pattern = re.compile(r'\w+|[{}]'.format(re.escape(punctuation))) 

parts = pattern.findall(line) 

这样做,你并不需要筛选出空白的优势:

>>> pattern = re.compile(r'\w+|[{}]'.format(re.escape(punctuation))) 
>>> pattern.findall(line) 
['Je', 'suis', ',', 'FOU', 'et', 'toi', '?', '!'] 
相关问题