Python100Days研究ノート--- Day12文字列と正規表現

正規表現を使用します

正規表現の知識
プログラミングやウェブ処理、文字列の時には、文字列の出会いに正規表現の特定の複雑なルールを見つける必要があることが多いの正規表現がある言い換えれば、これらのルールを説明するためのツールですパターン文字列の一致を(パターンマッチング部との文字列があるかどうか確認するか、から抽出された、または文字列がパターンに一致する部分を交換する方法)を定義するツール。ファイル名(*と?)を指定するときは、Windowsオペレーティングシステムを見つけるために使用されるファイルとワイルドカードを使用した場合、その後の正規表現も同様の一致したテキストとツールのために使用されるが、正規表現のワイルドカードと比較され、より強力なスタイルは、それがより正確に(もちろん、あなたのニーズを記述することができ、あなたは正規表現を書いている支払う価格が遊びにワイルドカードよりもはるかに複雑で、あなたに価格のすべての利点をもたらすために何かを知っています「 - 」プログラミング言語を学ぶことに似て)、例えば、あなたがして2-3の数字、ハイフン0を持つすべての始まりを見つけるために使用される正規表現を書くことができます最後、7または8 (0813-7654321または028-12345678など)数値文字列は、この国内の固定電話番号してくださいではありません。当初コンピュータは数学や出産を行うために、我々はコンピュータが認識できるようにしたいとテキストに沿った特定のパターンを処理し、情報の処理は、基本的価値であり、私たちは日常業務の情報を扱っている今日では、基本的にはテキストデータであり、 、正規表現は非常に重要です。今日では、ほとんどすべてのプログラミング言語は正規表現操作のサポートを提供し、Pythonは正規表現は標準ライブラリの再モジュールが運営をサポートしています。

私たちは、次の質問を検討することができます:我々は、(テキストファイルである可能性があり、ネットワーク上のニュースかもしれない)文字列中の電話番号や固定電話の番号を見つけることを期待して、どこから文字列を取得します。もちろん、私たちは(あなたはそれがこの電話番号を「25012345678」を見ていないので、ノートではないランダムな11桁の数字)11ビットのデジタルで電話番号を設定し、同じパターンが、固定電話番号を記載していない場合保つことができますこのタスクを達成するために正規表現を使用することは非常に面倒になります。

正規表現についての知識、あなたがこの記事を読んだ後、あなたが肯定の私たちの表現で、次の表を参照して、読むことができ、「30分ガイドの正規表現」と呼ばれる非常に有名なブログを読むことができます基本的な記号のいくつかの簡単な要約。

ここに画像を挿入説明

ここに画像を挿入説明

ここに画像を挿入説明

ここに画像を挿入説明
説明:あなたは、文字を一致させる必要がある場合は、正規表現の特殊文字で、あなたはエスケープ\使用することができ、たとえば、あなたは直接の書き込みは任意の文字に一致しますので、小数点が、それに書き込むことができます一致させたい、同じトークン、あなたはマッチさせたいです。括弧が書き込まれなければならない(と)、またはグループ化括弧は正規表現として扱われます。

正規のサポートのPython式
Pythonの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モジュール正規表現が繰り返し使用が必要な場合、実際の開発は、代替的に、正規表現オブジェクトのメソッドによって、これらの機能のために使用することができる、関数をコンパイルし、コンパイルすることによって第一の正規表現スタイルと正規表現オブジェクトを作成するには、間違いなく賢明な選択です。

私たちはPythonで正規表現を使用する方法の一連の例を通してあなたを教えてみましょう。

実施例1:検証入力されたユーザ名およびQQ番号が有効であり、対応するプロンプト情報。

"""
验证输入用户名和QQ号是否有效并给出对应的提示信息

要求:用户名必须由字母、数字或下划线构成且长度在6~20个字符之间,QQ号是5~12的数字且首位不能为0
"""
import re


def main():
    username = input('请输入用户名: ')
    qq = input('请输入QQ号: ')
    # match函数的第一个参数是正则表达式字符串或正则表达式对象
    # 第二个参数是要跟正则表达式做匹配的字符串对象
    m1 = re.match(r'^[0-9a-zA-Z_]{6,20}$', username)
    if not m1:
        print('请输入有效的用户名.')
    m2 = re.match(r'^[1-9]\d{4,11}$', qq)
    if not m2:
        print('请输入有效的QQ号.')
    if m1 and m2:
        print('你输入的信息是有效的!')


if __name__ == '__main__':
    main()

ヒント:、文字列の各文字は、その本来の意味は「生の文字列」いわゆるされている(R追加文字列の前にある)「元の文字列」の文言の書き込みに使用する正規表現、上記もっとぶっきらぼう文字列にそれを置くエスケープ文字の友人のようなものではありません。正規表現のメタ文字とは、多くの場所は、あなたが例えば、バックスラッシュ\を示すを書くために、元のstring'llの必要性を使用しない場合は、\ \ Dへの書き込み番号を持っているdは、エスケープする必要がありますので、これが唯一の書き込みに不便されていません読んでいる間、それは非常に困難になります。

例2:テキストのための国内の電話番号からの抜粋。

下の写真は2017年の終わりで、国内3事業者は、携帯電話番号のセクションを立ち上げました。

ここに画像を挿入説明

import re


def main():
    # 创建正则表达式对象 使用了前瞻和回顾来保证手机号前后不应该出现数字
    pattern = re.compile(r'(?<=\D)1[34578]\d{9}(?=\D)')
    sentence = '''
    重要的事情说8130123456789遍,我的手机号是13512346789这个靓号,
    不是15600998765,也是110或119,王大锤的手机号才是15600998765。
    '''
    # 查找所有匹配并保存到一个列表中
    mylist = re.findall(pattern, sentence)
    print(mylist)
    print('--------华丽的分隔线--------')
    # 通过迭代器取出匹配对象并获得匹配的内容
    for temp in pattern.finditer(sentence):
        print(temp.group())
    print('--------华丽的分隔线--------')
    # 通过search函数指定搜索位置找出所有匹配
    m = pattern.search(sentence)
    while m:
        print(m.group())
        m = pattern.search(sentence, m.end())


if __name__ == '__main__':
    main()

説明:14個の数字のみ145または147、および正規表現上記の始まりのような国内の携帯電話の番号、より良い正規表現に一致するように、このケースを考慮していない、ので、上記の国内の電話番号の正規表現にマッチするが、良い十分ではありません式が書かれている:(<= \ D?) (1 [38] \ D {9} | 14 [57] \ D {8} | 15 [0-35-9] \ D {8} | 17 [678 ] \ D {8})( ?= \ d)に、 国最近、それが19と16は、電話番号の先頭にありますが、これは、我々はそれを考慮して、一時的な列ではないようです。

例3:置換文字列不適切なコンテンツで

内容略

説明:nは再モジュール式の相関関数は、複数の行の一致、デバッグするかどうかの情報、そのかどうか、整合マークによって指定することができる場合を無視するか否かを、正規表現マッチングタグを表すフラグパラメータを有しますように。あなたが値パラメータ複数のフラグを指定する必要がある場合は、重ね合わせたりすることができ、そのようなフラグ= re.Iとしてビット演算子、| re.M.

例4:長い文字列を分割します

import re


def main():
    poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
    sentence_list = re.split(r'[,。, .]', poem)
    while '' in sentence_list:
        sentence_list.remove('')
    print(sentence_list)  # ['窗前明月光', '疑是地上霜', '举头望明月', '低头思故乡']


if __name__ == '__main__':
    main()

言葉の後
、あなたは、爬虫類の開発に使用する場合、それはすぐに私たちはもちろん、Webページのコードから、我々は必要な情報を指定し、抽出したパターンのいくつかの種類を見つけるために私たちを助けることができるので、その後、正規表現は、非常に良いヘルパーでなければなりません手始めのために、適切な正規表現を書くための権利は、実際の開発爬虫類印加時間ので、多くありますが、(もちろん、いくつかの一般的な正規表現が直接オンライン見ることができます)簡単なことではないかもしれません人々は、エキスと一致した情報に美しいスープやlxmlのを選択します前者は簡便であるが、パフォーマンスの低下、良く使いやすいと行いの両方であるが、インストールは、トラブルのビットです、我々は爬虫類のトピックの後半に誰にでもコンテンツになります導入。

公開された124元の記事 ウォンの賞賛141 ビュー160 000 +

おすすめ

転載: blog.csdn.net/weixin_36838630/article/details/105206843