Python で複数の区切り文字に基づいて文字列を分割する方法
Python 文字列 split()
メソッドを使用すると、区切り文字に基づいて文字列をリストに簡単に分割できます。ただし、場合によっては、1つだけでなく複数の区切り文字の値に基づいて分離を行う必要があります。この簡単な 101 の記事では、Python で実現できる 2つの便利なアプローチを紹介しています。
2つの区切り文字を持つ Python 分割文字列
次の文字列を想定します。
text = "python is, an easy;language; to, learn."
この例では、セミコロンの後にスペース ;
が続くか、コンマの後にスペース 、
が続くように分割する必要があります。この場合、末尾にスペースのない ,
、;
のように、単一のセミコロンまたはコンマの出現は関係ありません。
正規表現
正規表現の使用は、文字列の解析に関しては非常にコストがかかる性質であるため、しばしば不快になりますが、このような状況では安全に保証できます。
基本的な表現の使用
Python の組み込みモジュール re
には、この場合に使用できる split()
メソッドがあります。
複数の区切り文字を区切るために、基本的な a または b 正規表現(a|b
)を使用してみましょう。
import re
text = "python is, an easy;language; to, learn."
print(re.split("; |, ", text))
出力:
['python is', 'an easy;language', 'to', 'learn.']
ウィキペディアのページで述べたように、正規表現はその構文の標準として IEEE POSIX を使用します。この標準を参照することにより、ユースケースに一致する正規表現を作成する方法をいくつか追加して管理できます。
区切り文字を定義するためにバーセパレーター(|
)を使用する代わりに、正規表現で提供される範囲([]
)構文を使用して同じ結果を得ることができます。角かっこで囲むことにより、正規表現が一致できる文字の範囲を定義できます。
したがって、正規表現のパターンを指定するときは、角括弧内にセミコロンとコンマを追加し、追加のスペース [;、]
を指定するだけで、正規表現が文字列の一部と完全に一致するようになります[セミコロン OR カンマ]と末尾のスペース。
import re
text = "python is, an easy;language; to, learn."
print(re.split("[;,] ", text))
関数にする
前述の基本的な表現は、ハードコードされたセパレータのセットに限定されていました。これにより、区切り文字の変更が発生したときに手間がかかり、コードの他の部分での再利用性も制限されます。したがって、ベストプラクティスを使用するという点では、コードをより汎用的で再利用可能にすることを検討する方が適切です。安全のために、そのロジックを Python 関数にコーディングしましょう。
import re
text = "python is, an easy;language; to, learn."
separators = "; ", ", "
def custom_split(sepr_list, str_to_split):
# create regular expression dynamically
regular_exp = "|".join(map(re.escape, sepr_list))
return re.split(regular_exp, str_to_split)
print(custom_split(separators, text))
文字列関数の使用
正規表現の使用を控えたい場合や、文字列を分割するためだけにプロジェクトに新しいモジュールを導入する必要がない場合は、replace()
を使用できます。および split()
文字列モジュールに存在するメソッド同じ結果を達成するための一種のハッキーな方法で自体。
text = "python is, an easy;language; to, learn."
# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = text.replace("; ", ", ")
print(text_one_delimiter.split(", "))
ここではまず、文字列内のセミコロンとそれに続くスペース ;
のすべての出現箇所を、コンマとスペース 、
が続く他の区切り文字で置き換えます。このようにして、文字列の分割を 1つの区切り文字に制限できます。この場合、カンマの後にスペース 、
が続きます。
これで、Python 文字列モジュールに組み込まれている単純な split()
関数を使用して、変更された文字列を安全に分割し、同じ結果を得ることができます。
今回は、結果を達成するためにコードに新しいモジュールをインポートしていないことに注意してください。
複数の区切り文字を持つ Python 分割文字列
以下のテキストを検討してください。
text = "python is# an% easy;language- to, learn."
この例では、すべてのインスタンスでテキストを分割する必要があります。テキストには # % ; - ,
のいずれかの文字があり、その後にスペースが続くすべてのインスタンスでそれを分割する必要があります。
正規表現
この場合、正規表現を定義するときに、セパレータを簡単に追加できます。
import re
text = "python is# an% easy;language- to, learn."
print(re.split("; |, |# |% |- ", text))
出力:
['python is', 'an', 'easy;language', 'to', 'learn.']
機能として
この状況でも、2つの区切り文字を使用して以前に使用したものと同じコードを使用して、すべてのセパレータを separators
変数に追加するだけの簡単な変更を加えることができます。
import re
text = "python is# an% easy;language- to, learn."
separators = "; ", ", ", "# ", "% ", "- "
def custom_split(sepr_list, str_to_split):
# create regular expression dynamically
regular_exp = "|".join(map(re.escape, sepr_list))
return re.split(regular_exp, str_to_split)
print(custom_split(separators, text))
文字列関数の使用
以前に 2つの区切り文字で処理した方法と同様に、replace()
と split()
これも処理する関数。
text = "python is, an easy;language; to, learn."
# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = (
text.replace("# ", ", ").replace("% ", ", ").replace("; ", ", ").replace("- ", ", ")
)
print(text_one_delimiter.split(", "))
出力:
['python is', 'an easy;language', 'to', 'learn.']
この例のようにデリミタ数を増やす場合は、この方法はお勧めできません。この場合、文字列の replace()
メソッドは文字列を複数回トラバースするために複数回使用する必要があるため、正規表現を使用すると簡単に回避できる望ましくないパフォーマンススパイクが最終的に発生します。