正規表現使用学習(C++、Qt、Python)


前に書く
個人的には正規表現についてよく知らないので、本文の内容が漏れていることが多いはずです.皆さんに誤解を与えないことを願っています.
本明細書では、C++0 x、Qt 4、Python 3、Vimの正規表現について簡単に説明する.
  • C++0 x:regexpヘッダファイルに一連のテンプレートクラス
  • を提供する
  • Qt 4:ではQRegExpクラス
  • が用意されています.
  • Python 3:にはreモジュール
  • が用意されています.
  • Vim:コマンドモードとスクリプトサポート正則
  • めまいがして、午前中書いて、意外にもこのように書いて、Vimは意外にもすべて関与していないで、その他の部分もめちゃくちゃで、額、もともとそれらの間のpatternの上の区別を整理したいのです.どうでもいいから、先にそうしましょう.
    2011.08.20
    用途
    2つの問題+3つの動作?(どう分類すればいいか分からない…):
  • match:文字列はこのモード(pattern)に一致しますか?
  • search:文字列にパターンに一致する文字列はありますか?
  • capture:一致する文字列を取得
  • replace:置換文字列(サブストリング)
  • split:分割文字列
  • 使用
    pattern文字列の準備
    これ?メタ文字、単一文字のマッチング、重複マッチングなど、関連資料が多すぎるようですね.ここでは省略します.
    Pythonはraw文字列の字面量書き方を提供し、C++0 xもこの機能を提供しているが、コンパイラは現在サポートされていないようだ.
    //C++0x
    const char * str1 = "C://windows//system32";
    const char * str2 = R"(C/windows/system32)";

    patternオブジェクトの生成
    Python
    re.compile(pattern,flags=0)生成オブジェクト
    Qt
    QRegExpコンストラクタを使用すると、QRegExp::setPattern()で変更できます.
    C++0x
    テンプレートクラスでbasic_regex構造
    Pythonの下、re.compile()は、正規表現オブジェクト(Regular Expression Objects)を生成できます.
    >>> import re
    >>> re.compile(r"dbzhang8\d{2}")
    <_sre.SRE_Pattern object at 0xb731c720>
    >>> 

    後でreモジュールレベルの関数のみを使用する場合、例えばre.match(r"dbzhang 8d{2},"dbzhang 800")では、compileを使用して正規表現オブジェクトを生成する必要はありません.
    C++0 xとQtで直接コンストラクション関数を使用してオブジェクトを生成
    QRegExp qt_pattern("dbzhang8\\d{2}");
    std::regex cpp_pattern("dbzhang8\\d{2}");

    C++0 xでは、char,wchar_がありますt,char16_t,char32_tこの4つの文字タイプ、std::regexは別名typedef basic_にすぎませんregex regex;
    照合操作の実行
    Pythonを見て
    match()
    REが文字列「先頭」から一致するか否かを判定する
    成功するとMatchObjectオブジェクトが返されます.そうしないとNoneが返されます.
    この4つの関数には、モジュールレベルとオブジェクトのメンバー関数の2つの形式があります.違いは、後者が繰り返し使用できる正規表現オブジェクトをコンパイルする必要があることです.
    search()
    文字列をスキャンして、一致する文字列があるかどうかを確認します.
    findall()
    一致するすべての文字列を検索し、リストとして返します.
     
    finditer()
    一致するすべての文字列を検索し、反復器(iterator)で返します.
     
    簡単な例:
    >>> p = re.compile(r"dbzhang8\d{2}")
    >>> print(p.match("dbzhang-800"))
    None
    >>> p.match("dbzhang801")
    <_sre.SRE_Match object at 0xb71d3fa8>
    >>> p.findall("dbzhang801dbzhang802")
    ['dbzhang801', 'dbzhang802']
    注意:MatchObjectは、一致する文字列を抽出するために使用できる一致情報を含む.
    Qtを見て
    QRegExp::exactMatch()
    文字列が完全に(最初から最後まで)一致しているかどうかを判断し、真または偽を返します.
    この3つの操作は、前のpythonのMatchObjectと同様にmatchedLength()、capturedTexts()、pos()の情報を設定します.
    QRegExp::indexIn()
    文字列を検索して一致する文字列を見つけて、インデックス値を返して、失敗して-1を返します
    QRegExp::lastIndexIn()
    同じように、後ろから前へ検索するだけです.
    QString::indexOf()
     
    検索するだけなら、この2つの方が便利ですが、追加のcapturedTextsなどの情報は入手できません
    QString::contains()
    一致するかどうか
    QString::count()
    何度マッチ
    うん、C++0 xを見て
    regex_match()
    式は文字列に完全に一致しますか?
    戻り値はブール量ですが、実行時にmatch_が入力されます.resultsオブジェクトは、文字列スナップに使用されます.注:これらはアルゴリズムであり、前述のbasic_ではありません.regexのメンバー関数.
    regex_search()
    文字列の一部に一致しますか?
    Capture情報を見てみましょうか?
    Capture文字列を使用するには、正規のpatternでカッコ「()」を使用して一部を包む必要があります.
    前に見えるのは、match、search、index、...などの操作で、追加の情報が追加されます.
  • PythonでMatchObjectオブジェクトを生成する
  • C++0 x充填match_resultオブジェクト
  • Qtは、QRegExpオブジェクト自身のmatchedLength()、capturedTexts()、pos()のメンバー関数
  • を通過する.
    Python
    group()
    一致する文字列を返します
    どのグループ(またはいくつか)を指定する必要があります.デフォルトは0グループ(自身に一致)です.
    start()
    一致する開始位置を返します
    end()
    一致する終了位置を返します
    span()
    開始位置と終了位置を含むメタグループ(tuple)を返します.
    groups()
    一致するすべてのグループを返します
     
    Qt中:
    matchedLength()
    一致する長さ
     
    captureCount()
    式に含まれるスナップグループの数
     
    capturedTexts()
    スナップされた文字列のリスト
    pos(int n)
    n番目のグループの位置
    cap(int n)
    n番目のグループの内容(0はマッチング自体を表す)
    C++0 x:
    match_results::operator[](size_type n)
    n番目のスナップグループを返します(0はマッチング自体を表します)
    返されるのはsub_matchテンプレートクラスのオブジェクト
    match_results::prefix()
    マッチされた子列の前の列を返します
    match_results::suffix()
    マッチされたサブ列の後ろの列を返します
    match_results::empty()
    マッチングに失敗した場合のみtrueを返します
     
    match_results::size()
    グループの数
     
    match_results::str()
    グループの内容
     
    match_results::position()
    位置
     
    4つの別名:
    typedef match_results<const char*> cmatch;
    typedef match_results<const wchar_t*> wcmatch;
    typedef match_results<string::const_iterator> smatch;
    typedef match_results<wstring::const_iterator> wsmatch;
    変更操作の実行
    Python
    split()
    分割文字列
    最大分割または置換の数を指定できます
    sub()
    一致するすべてのサブストリングを置換
    subn()
    同じですが、同時に何回戻るかの置換が発生します(メタグループを返します)
    Qt中:
    QString::split()
    すべてQStringのメンバー関数で、簡単明瞭です
    QString::section()
    QString::replace()
    QString::remove()
    C++0 x:
    regex_replace()
    これだけですか.ほほほ
    リファレンス
  • http://docs.python.org/howto/regex.html
  • http://docs.python.org/py3k/library/re.html
  • http://doc.qt.nokia.com/4.7/qstring.html
  • http://doc.qt.nokia.com/4.7/qregexp.html
  • http://www.greenend.org.uk/rjk/2002/06/regexp.html