Day 12-文字列と正規表現


日付:2021年1月29日
今日はPythonの勉強の12日目で、正規表現はCTFに参加したときに接触しましたが、正規マッチングコミットでFLAGを取得することで、今日は少し楽になります.
学習用の教材はGitHubでラクダホが書いた「Python-100日初心者からマスターまで」
正規表現30分入門チュートリアル:https://deerchao.cn/tutorials/regex/regex.htm
正規表現オンラインテストWebサイト:https://regexr.com/
一、正規表現の基本記号
正規表現は、ニーズを正確に記述する強力なテキストマッチングツールです.
次は基本記号のまとめです
アイコン
説明する

説明
.
任意の文字に一致
b.t
bat/but/b#t/b 1 t等にマッチ可能
\w
アルファベット/数値/アンダースコアの一致
b\wt
bat/b 1 t/b_に一致t等だがb#tに一致しない
\s
一致する空白文字(r、、tなどを含む)
love\syou
love youにマッチできる
\d
一致する数値
\d\d
01/23/99などのマッチングが可能
\b
単語の境界を一致させる
\bThe\b
^
一致文字列の開始
^The
Theの先頭に一致する文字列
$
一致文字列の終了
.exe$
一致する.exe末尾の文字列
\W
アルファベット/数値/アンダースコアの一致
b\Wt
b#t/にマッチ可能b@t等が一致しないbut/b 1 t/b_t等
\S
空白以外の文字の一致
love\Syou
love#you等にマッチできるがlove youにはマッチしない
\D
非数値の一致
\d\D
9 a/3#/0 Fなどにマッチ可能
\B
単語以外の境界を一致させる
\Bio\B
[]
文字セットからの任意の単一文字を一致させる
[aeiou]
任意のアクセント文字を一致させることができます
[^]
文字セットにない任意の単一文字を一致させる
[^aeiou]
いずれかのアクセント以外の文字を一致させることができます
*
0回以上マッチ
\w*
+
1回以上マッチ
\w+
?
0回または1回マッチ
\w?
{N}
マッチングN回
\w{3}
{M,}
少なくともM回マッチング
\w{3,}
{M,N}
マッチングは少なくともM回からN回まで
\w{3,6}
|
ブランチ
foo|bar
fooかbarにマッチできます
(?#)
コメント
(exp)
expと一致し、自動ネーミングされたグループにキャプチャ
(?exp)
expと一致してnameというグループにキャプチャ
(?:exp)
一致expは一致しますが、一致するテキストは取得されません.
(?=exp)
expの前の位置に一致
\b\w+(?=ing)
I’m dancingのdancと一致できる
(?<=exp)
expの後ろの位置に一致
(?<=\bdanc)\w+\b
I love dancing and readingの最初のingに一致することができます
(?!exp)
一致後expでない位置
(?
前のexpでない位置に一致
*?
何度も繰り返しますが、できるだけ繰り返さないでください.
a.*ba.*?b
正規表現をaaabに適用すると、前者は文字列aaab全体に一致し、後者はaabとabの2つの文字列に一致します.
+?
1回以上繰り返しますが、できるだけ繰り返さないでください.
??
0回または1回繰り返しますが、できるだけ繰り返さないでください.
{M,N}?
MからN回繰り返しますが、できるだけ繰り返さないでください.
{M,}?
M回以上繰り返しますが、できるだけ少なく繰り返します
なお、マッチングが必要な文字が正規表現の特殊文字である場合には、\\を用いてエスケープ処理を行うことができる、例えば、マッチングしたい小数点を\\.と書くことができる、直接書くためである.任意の文字に一致します.同様に、カッコを一致させるには\\(\\)と書かなければなりません.そうしないと、カッコは正規表現のグループと見なされます.
二、Pythonの正規表現に対するサポート
pythonは、正規表現関連操作をサポートするreモジュールを提供します.次はreモジュールのコア関数です.
関数#カンスウ#
説明
compile(pattern, flags=0)
正規表現のコンパイル正規表現オブジェクトを返す
match(pattern, string, flags=0)
正規表現で文字列を一致させ、一致するオブジェクトを正常に返します.そうでなければNoneを返します.
search(pattern, string, flags=0)
検索文字列に正規表現が最初に表示されたパターンは、一致するオブジェクトを返すのに成功しました.そうでなければNoneを返します.
split(pattern, string, maxsplit=0, flags=0)
正規表現で指定したモード区切り文字列を分割してリストを返す
sub(pattern, repl, string, count=0, flags=0)
元の文字列の正規表現と一致するパターンを指定した文字列で置き換えるcountで置き換える回数を指定できます
fullmatch(pattern, string, flags=0)
match関数の完全一致(文字列の先頭から末尾まで)バージョン
findall(pattern, string, flags=0)
正規表現に一致するすべてのパターンが文字列を返すリストを検索
finditer(pattern, string, flags=0)
正規表現に一致するすべてのパターンを検索して反復器を返します
purge()
暗黙的にコンパイルされた正規表現のキャッシュをクリア
re.I/re.IGNORECASE
大文字と小文字の一致を無視
re.M/re.MULTILINE
複数行一致タグ
説明:上記のreモジュールのこれらの関数は、実際の開発では、これらの関数の使用を正規表現オブジェクトの方法で置き換えることもできます.正規表現を繰り返し使用する必要がある場合は、compile関数を使用して正規表現をコンパイルし、正規表現オブジェクトを作成するのが賢明です.
三、自動マッチングランダムマッチング正規表現
CTFのWEB問題をしていつも正則の一致する問題があって、ここは1つの正則の一致するプログラムを添付します
from xeger import Xeger

def main():
    print('*'*10,'    ','*'*10,'
'
) _x = Xeger() zhengze=input(' :') n=int(input(' :')) for i in range(n): testStr = _x.xeger(zhengze) print(testStr) input('
'
) if __name__=='__main__': main()