2016-11-21 25 views
-1

複数の区切り文字を使用して文字列を分割しようとしています。区切り文字を単語として保持する必要があります。 私が使用しているデリミタは、すべての句読点とスペースです。Python分割文字列と区切り文字を単語として保持

たとえば、文字列:

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' 
'?' 
'!' 

を私が書いた

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

分割が正しいと思われますが、結果リストに区切り文字が含まれていません:(

答えて

2

式をre.split()のグループに入れて保存する必要があります。私はまず空白に分割しませんでした。後でホワイトスペースのみの文字列をいつでも削除することができます。あなたは、各区切り文字を使用する場合は別々その後、あなただけの\s空白のグループに+数量詞を使用する必要がありますよりもむしろ

>>> 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', '?', '!'] 

# 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()] 

リストの内包は、空白のみで構成されて何かを削除しますまた、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', '?', '!'] 
関連する問題