正規表現のデータ構造を 5 分でマスター (Python)
注意を払う!
⭐1. re.search() re.match() re.findall() re.finditer() 見つかったコンテンツや見つかった場所を直接返す代わりに、一致するオブジェクトを返します。
⭐2. span() 関数は一致した開始位置と終了位置を返します。(開始を含む、終了を除く ----[3,5) )
⭐3. group() 関数は、一致したコンテンツを直接返します
注意を払う!
-
0.正規表現ルール表
-
1. re.search()------マッチ検索
-
2. re.match() ----- 最初からマッチ
-
3. re.findall()------すべてを検索
-
4. re.finditer()----イテレータを返す
-
5. re.split()---------正規化されたセグメンテーション
-
6. 式一致ルール – クイック検索
-
7. 式一致のケース – 素早い理解
0.正規表現ルール表
0) 正規表現修飾子 - オプションのフラグ
モディファイア | 説明 |
---|---|
再I | 一致する大文字と小文字を区別しない |
再L | ロケールを意識したマッチングを行う |
レム | 複数行一致、^ と $ に影響 |
re.S | make . 改行を含むすべての文字に一致 |
re.U | Unicode 文字セットに従って文字を解析します。このフラグは、\w、\W、\b、\B に影響します。 |
re.X | このフラグを使用すると、より柔軟な書式設定が可能になるため、理解しやすい正規表現を記述できます。 |
1) 特殊文字
例 | 説明 |
---|---|
. | "\n" を除く任意の 1 文字に一致します。「\n」を含む任意の文字に一致させるには、「[.\n]」のようなパターンを使用します。 |
\d | 数字に一致します。[0-9] に相当します。 |
\D | 数字以外の文字に一致します。[^^0-9] と同等です。 |
\s | スペース、タブ、フォーム フィードなど、あらゆる空白文字に一致します。[ \f\n\r\t\v] と同等。 |
\S | 空白以外の任意の文字に一致します。[^^ \f\n\r\t\v] と同等です。 |
\w | アンダースコアを含む任意の単語文字に一致します。「[A-Za-z0-9_]」と同等。 |
\W | 単語以外の任意の文字に一致します。「[^^A-Za-z0-9_]」と同等。 |
3) 覚えておく必要があります
^ | 文字列の先頭に一致 |
---|---|
$ | 文字列の末尾に一致します。 |
. | 改行を除く任意の文字に一致し、re.DOTALL フラグが指定されている場合は、改行を含む任意の文字に一致します。 |
[…] | 個別にリストされた文字のグループを表すために使用されます: [amk] は「a」、「m」、または「k」に一致します。 |
[^…] | [] 以外の文字: [^abc] は、a、b、c 以外の文字に一致します。 |
再* | 0 個以上の式に一致します。 |
再+ | 1 つ以上の式に一致します。 |
再? | 先行する正規表現で定義された 0 または 1 つのフラグメントに一致、貪欲でない |
re{n} | 直前の n 個の式に正確に一致します。たとえば、o{2} は「Bob」の「o」には一致しませんが、「food」の両方の o には一致します。 |
re{n,} | 前の式の n 回の出現に一致します。たとえば、o{2,} は「Bob」の「o」には一致しませんが、「fooooood」のすべての o には一致します。「o{1,}」は「o+」と同等です。「o{0,}」は「o*」と同等です。 |
re{n、m} | 前の正規表現で定義されたセグメントの n 倍から m 倍まで、貪欲に一致させます。 |
| b | a または b に一致 |
(再) | 正規表現をグループ化し、一致したテキストを記憶する |
(?imx) | 正規表現には、i、m、または x の 3 つのオプションのフラグが含まれます。括弧で囲まれた領域のみが影響を受けます。 |
(?-imx) | 正規表現は、i、m、または x オプションのフラグをオフにします。括弧で囲まれた領域のみが影響を受けます。 |
(?:再) | (…) のようですが、グループを示しません |
(?imx:re) | 括弧内に i、m、または x オプションのフラグを使用する |
(?-imx:re) | 括弧内に i、m、または x オプション フラグを使用しないでください |
(?#…) | ノート。 |
(?= レ) | 前方の正の区切り文字。... で示される含まれている正規表現が現在の位置で正常に一致する場合は成功し、それ以外の場合は失敗します。しかし、含まれている式が試行されると、マッチング エンジンはまったく先に進まず、パターンの残りの部分も区切り文字の右側を試行します。 |
(?!再) | 先読み否定区切り文字。正の区切り記号の反対です。含まれている式が文字列内の現在の位置で一致しない場合に成功します。 |
(?> レ) | バックトラッキングを省略したマッチング用の独立したパターン。 |
\w | 英数字とアンダースコアに一致 |
\W | 非英数字とアンダースコアに一致 |
\s | 匹配任意空白字符,等价于 [ \t\n\r\f]。 |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9]. |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
\B | 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
\n, \t, 等. | 匹配一个换行符。匹配一个制表符。等 |
\1…\9 | 匹配第n个分组的内容。 |
\10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |
1、re.search()------匹配查找
-
目的:
扫描整个字符串并返回第一个成功的匹配
-
使用方法
re.search(pattern, string)
pattern 匹配的正则表达式
string 需要匹配的字符串
-
使用案例
import re re.search('go*gle','www.google.com') >>> <_sre.SRE_Match object; span=(4, 10), match='google'> re.search('go*gle','www.google.com').span() >>> (4, 10) re.search('go*gle','www.google.com').span()[0] >>> 4 re.search('go*gle','www.google.com').group() >>> google
-
注意事项
1、返回值是一个对象,不能直接使用,需要配合span()、group()等函数才可以完成任务。
2、search()函数找不到的话,返回的是None,而None是没有span()等方法的,而直接调用是会出错的,所以需要在写程序的时候增加一条判空语句
2、re.match() -----从第一位匹配
-
目的:
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。
-
使用方法
re.match(pattern, string)
pattern 匹配的正则表达式
string 需要匹配的字符串
-
使用案例
import re re.match('google.','www.google.com') >>> None re.match('w..','www.google.com') >>> <_sre.SRE_Match object; span=(0, 2), match='ww'> re.match('w.','www.google.com').span() >>> (0, 2) re.match('w.','www.google.com').span()[0] >>> 0 re.match('w.','www.google.com').group() >>> ww
-
注意事项
只能从第一个字符开始匹配,如果第一个字符不能相互对应,则返回None。故一般不用
3、re.findall()------查找所有
-
目的:
找到正则表达式所匹配的所有子串,并返回一个列表
-
使用方法
str.findall(string , pos = 0,endpos = len(str))
str 匹配的正则表达式
string 需要匹配的字符串
pos 指定字符串的起始位置,默认为 0—可选参数
endpos 指定字符串的结束位置,默认为字符串的长度—可选参数
-
使用案例
import re pattern = re.compile(r'\d+') str = 'asd123qwe456opi789mnb012' pattern.findall(str) >>> ['123', '456', '789', '012'] pattern.findall(str,0,12) >>> ['123', '456'] re.findall(r'(\w+)=(\d+)', 'set w=30 and h=40') # 多个匹配模式,返回元组列表 >>> [('w','30'),('h','40')]
注意事项
不是返回找到字串的位置,而是返回字串的值。
4、re.finditer()----返回迭代器
-
目的:
扫描整个字符串并返回第一个成功的匹配
-
使用方法
re.finditer(pattern, string, flags=0)
- 使用案例
import re
it = re.finditer(r"\d+","78a32bc43jf3")
for iter in it:
print (iter.group() )
- 注意事项
返回的是迭代器无法直接输出
5、re.split()---------规则化分割
-
目的:
扫描整个字符串并返回第一个成功的匹配,按照能够匹配的子串将字符串分割后返回列表
-
使用方法
re.split(pattern, string[, maxsplit=0, flags=0])
- 使用案例
>>>import re
>>> re.split('\W+', 'baidu, google, sogo.')
['baidu', 'google', 'sogo', '']
- 注意事项
将所有匹配到的事项,存储到一个list当中,并返回。