正規表現とは
正規表現はメタ文字と呼ばれる文字を使用して、
文字列の検索や抽出、置換などを行うことが出来ます。
Pythonでは標準ライブラリで提供されている、
reモジュールをimportして正規表現を使用します。
reはregular expressionの略です。
基本的な使い方としては、
正規表現のパターンと対象となる文字列をreモジュールの
用途に合わせたメソッドに引数として渡してその結果を取得します。
検索関連
####matchメソッド
文字列の先頭でパターンがマッチするかどうか判定。
matchObject(オブジェクト)が返ります。
matchObject(オブジェクト)が返る = re.match(パターン, 対象の文字列)
そのオブジェクトから値を取り出すメソッド。
使い方はそれぞれ、
matchObject.group() 正規表現にマッチした文字列が返る。
matchObject.start() マッチの開始位置が返る。
matchObject.end() マッチの終了位置が返る。
matchObject.span() マッチの位置 (start, end) を含むタプルが返る。
###searchメソッド
文字列全体とパターンにマッチする箇所を判定。
複数マッチした場合でも、取得できるのは初めにマッチしたもののみ。
re.search(パターン, 対象のテキスト)
###findallメソッド
文字列中にパターンでマッチした文字列を返す。
パターンにグループが含まれる場合は文字列のタプルが返す。
re.findall(パターン, 対象のテキスト)
置換関連
###subメソッド
文字列置換を行います。
re.sub(パターン, 置換後の文字, 元のテキスト)
splitメソッド
文字列を指定した正規表現で分割します。
re.split(パターン, 対象の文字列)
#メタ文字
正規表現において、パターン化した文字列のことをメタ文字と言います。
公式にもありますが、reモジュールはPerlの強力な正規表現マッチング操作が使えます。
表記 | 意味 |
---|---|
. | 任意の一文字 |
^ | 行の先頭 |
$ | 行の末尾 |
* | 0回以上の繰り返し |
+ | 1回以上の繰り返し |
? | 0回または1回 |
\d | 数字[0-9] |
\D | 数字以外[^0-9] |
\s | 空白文字[\t\n\r\f\v] |
\S | 空白文字以外[^\t\n\r\f\v] |
\w | 英数字 |
\W | 英数字以外 |
\A | 文字列の先頭 |
\Z | 文字列の末尾 |
+ | 直前の文字が1回以上出現 |
* | 直前の文字が0回以上出現 |
? | 直前の文字が0回もしくは1回出現 |
[abc] | 列挙された文字群に含まれる文字 |
[^abc] | 列挙された文字群に含まれない文字 |
[a-b] | 指定された範囲に含まれる文字 |
[~a-b] | 指定された範囲に含まれない文字 |
(abc) | グループ化 |
(?=abc) | 先読み |
(?!abc) | 否定先読み |
(?<=abc) | 後読み |
(?<!abc) | 否定後読み |
実際にPythonで正規表現を使ってみる
まずはreモジュールをimportします。
今回はブラケット(角括弧)で囲まれた間の文字列のみを取得する正規表現を
書いてみます。
import re
text = 'Hello[Wor]ld!'
pattern = '(?<=\[)[^]]+(?=\])'
result = re.search(pattern, text)
print(result)
結果
<re.Match object; span=(6, 9), match='Wor'>
正解は他にも色々あると思いますが、
このように正規表現で欲しい値を取得することが出来ました。
参考
Python 3.7.3 ドキュメント
https://docs.python.org/ja/3/library/re.html
Python学習講座
https://www.python.ambitious-engineer.com/archives/1798
分かりやすいpythonの正規表現の例
https://qiita.com/luohao0404/items/7135b2b96f9b0b196bf3