Pythonの正規表現で空白にマッチさせ、改行は除外する方法
Pythonのreモジュールでは、\sは半角スペースやタブだけでなく、改行(\n)やキャリッジリターン(\r)を含むすべての空白文字にマッチします。そのため「空白にはマッチさせたいが、改行は対象外にしたい」というケースでは、\sをそのまま使うことはできません。本記事では、改行を除外した空白だけにマッチさせる方法を、具体例とともにわかりやすく解説します。
改行を除外して空白にマッチさせる正規表現パターン
最もよく使われるのは、否定文字クラスを組み合わせた次のパターンです。
[^\S\r\n]
このパターンを分解して確認してみましょう。
\S:空白「以外」の文字にマッチ(\sの否定)[^\S]:その否定の否定になるため、結果としてすべての空白文字にマッチ(実質\sと同じ)[^\S\r\n]:さらに\r(復帰)と\n(改行)を除外する
つまりこのパターンは「スペースやタブなどの空白にはマッチするが、改行にはマッチしない」という動作を実現します。
コード例
複数行の文字列から、改行を除く空白だけを抽出するサンプルです。
import re
text = """I find
Tutorialspoint useful"""
result = re.findall(r"[^\S\r\n]+", text)
print(result)
出力結果
[' ', ' ', ' ']
出力を見ると、単語間のスペースや行頭のインデント部分はマッチしていますが、改行(\n)自体はマッチ結果に含まれていないことがわかります。
代替方法:マッチさせたい空白文字を明示的に指定する
対象となる空白文字が限られている場合は、文字クラスで直接列挙するほうが意図が明確になり、コードも読みやすくなります。
import re
text = """I find
Tutorialspoint useful"""
# 半角スペースとタブのみにマッチ
result = re.findall(r"[ \t]+", text)
print(result)
このパターンでも同様に、改行はマッチ対象から除外されます。
まとめ
\sは改行も含むため、「改行を除外したい」用途にはそのまま使えない[^\S\r\n]を使えば、改行以外のあらゆる空白文字にマッチできる- マッチ対象が限定できるなら、
[ \t]のように明示的に指定するのが確実で保守性も高い
-
Pythonの正規表現で数字以外の文字のみをマッチ・抽出する方法
Pythonの正規表現(reモジュール)を使うと、文字列から数字以外の文字だけを簡単に抽出できます。パターン \D は「数字以外の1文字」にマッチし、\D+ と書くことで「数字以外の文字が1回以上連続している部分」にマッチします。例:re.search()で最初のマッチを取得する次のコードは、指定された文字列から数字以外の部分を正規表現でマッチさせます。import re m = re.search(r\D+, 5Need47for Speed 2) print(m)出力<re.Match object; span=(1, 5), match=Need>re.search() は
-
Pythonで正規表現を使って空白以外の文字にマッチさせる方法
Pythonで正規表現を使って文字列中の「空白以外の文字」を照合するには、\S(大文字のS)という特殊シーケンスを使用します。\S はスペース・タブ・改行などの空白文字以外の任意の1文字にマッチし、+ を組み合わせることで、連続した空白以外の文字列(単語など)をまとめて取得できます。re.search() を使った例次のコードは、指定した文字列から最初に見つかった空白以外の文字の連なりを検索します。import re foo = re.search(r\S+, Need for Speed 2) print(foo)出力<re.Match object; span=(0, 4), mat