ある文字列において、特定の文字がX文字以上連続した場合に限り、その連続した文字列で元の文字列を分割する
「ある文字列において、特定の文字がX文字以上連続した場合に限り、その連続した文字列で元の文字列を分割する」ことを考えた。
まずこれはどういうことか。具体例を示す。
例えば、何らかのテキストファイルを1行ずつ読み込んで処理をする場合に、特定の行が「不特定数の半角スペース区切りで複数の単語を列挙した行」である場合を考える。
具体的には「 列1 列2 列3 列4」といった場合である。
これを[列1,列2,列3, 列4]というようにsplitしたい時はどうするか。
最初は「半角スペース」で区切るだけなので、次のようにして解決かと考えた。
line.split()
しかし、これでは例えば「列1」という部分の文字列自体にに半角スペースが含まれていた場合にうまくいかない。
次のようなケースである。
line= ' favorite fruits favorite sports ' line.split() <class 'list'>: ['favorite', 'fruits', 'favorite', 'sports']
しかし、「意味を成す用語の場合は単語と単語の間は空白スペース1つで、2つ以上の空白スペースがある場合は用語の区切りと見なせる」場合、次のように対応できる。
import re re.compile(r'\s{' + str(2) + ',}').sub('anything', line.strip()).split('anything') <class 'list'>: ['favorite fruits', 'favorite sports']
ここで、'anything'の部分は一時的な文字列変換の結果であり、何でも良い。
この処理を解説すると次のような感じ。
line.strip() #両端の空白を削除 re.compile(r'\s{' + str(2) + ',}') #2文字連続する空白文字の正規表現。 #実は「re.compile(r'\s{2 ,}')」と書いているのと同じ。これは空白文字"\s"を{2,}で2回繰り返すことを表す正規表現だが、str(2)と書いているのは2の部分を変数化出来るようにするためである。 re.compile(r'\s{' + str(2) + ',}').sub('anything', line.strip())で、正規表現にマッチした部分を一旦'anything'という文字列に置換している。 最後に、いったん置換した'anything'という部分を区切り文字として、文字列を区切ってる。 re.compile(r'\s{' + str(continuous_char_number) + ',}').sub('anything', line.strip()).split('anything')