45052


旧タイトル:Python3の正規表現における，エスケープした大括弧の認識について  
_問題解決により改題を行いました_

* * *

Python3系の正規表現により，文章中に含まれる[1]や[2,3,10,...,n]のような，大括弧で囲まれた数字とカンマの一覧の取得を行いたいです．

正規表現は以下のように記述しましたが，マッチした箇所の取得がうまくいきませんでした．

[code]

    t_str = "44hogehoge[23][34][1,2,45][6,][]"
    ptnA = re.compile(r'\[{1}([0-9]{1,2}\,?\s*)+\]{1}', flags=re.MULTILINE)
    print(re.findall(ptnA,t_str))
    print(re.search(ptnA,t_str).group())
    
    >>>['23', '34', '45', '6,']
    >>>[23]
    
[/code]

このように，findallを用いた後に，始端終端で用意している[ ]が認識されません．  
また，連続して数字とカンマが出現する場合に，それら全てを取得することができていません．

patternをいくつか変更して試してみた結果を以下に示します．

[code]

    t_str = "44hogehoge[23][34][1,2,45][6,][]"
    ptnB = re.compile(r'\[([0-9]{0,2}\,?\s*)?\]', flags=re.MULTILINE)
    ptnC = re.compile(r'\[[0-9]{0,2}', flags=re.MULTILINE)
    print(re.findall(ptnB,t_str))
    print(re.findall(ptnC,t_str))
    print(re.search(ptnB,t_str).group())
    print(re.search(ptnC,t_str).group())
    
    >>>['23', '34', '6,', '']
    >>>['[23', '[34', '[1', '[6', '[']
    >>>[23]
    >>>[23
    
    # n, の組が3連続の場合のみ合致
    ptnA2 = re.compile(r'\[{1}([0-9]{1,2}\,?\s*){3}\]{1}', flags=re.MULTILINE)
    print(re.findall(ptnA2,t_str))
    print(re.search(ptnA2,t_str).group())
    
    >>>['45']
    >>>[1,2,45]
    
[/code]

<https://regex101.com/> を用いてptnAについて試したところ，意図していた通りの動作を確認できました．

Python3.5.2を使用しています．

ご教示よろしくお願いします．


CC BY-SA 4.0
2018-06-25T07:37:46.067
45049
2018-06-25T10:57:30.363
2018-06-25T10:57:30.363
24165
24165
question
python python3 正規表現
Python3の正規表現におけるfindallで、マッチした全体を取得したい


正規表現にグループが含まれる場合、[`re.findall`](https://docs.python.org/ja/3/library/re.html#re.findall)
はグループにマッチした文字列のタプルたちをリストとして返します。ご提示の正規表現では正規表現全体にマッチさせると角括弧が含まれていますが、グループ部分には角括弧が含まれていません。<https://regex101.com/>
で言うところの Full match と Group の差に当たります。

キャプチャされるグループが無ければ `re.findall` は full match を返します。したがってキャプチャされないグループ `(?: ...
)` を使ってグループ部分をキャプチャしないようにすれば良いです。

[code]

    >>> t_str = "44hogehoge[23][34][1,2,45][6,][]"
    >>> ptnA = re.compile(r'\[(?:[0-9]{1,2}\,?\s*)+\]', flags=re.MULTILINE)
    >>> print(re.findall(ptnA,t_str))
    ['[23]', '[34]', '[1,2,45]', '[6,]']
    
[/code]


CC BY-SA 4.0
2018-06-25T08:16:32.993
45052
2018-06-25T08:28:19.953
2018-06-25T08:28:19.953
19110
19110
45049
answer