2017-10-01 23 views
2
import re 
line = "..12345678910111213141516171820212223" 
regex = re.compile(r'((?:[a-zA-Z0-9])\1+)') 
print ("not coming here") 
matches = re.findall(regex,line) 
print (matches) 

上記のコードでは、繰り返し文字のグループをキャプチャしようとしています。正規表現を使用して繰り返し文字のセットをキャプチャする方法は?

だから、例えば私のような答えが必要です。をなど

が、私は上記のコードを実行したときに、私はこのエラーを取得:私はどこ

Traceback (most recent call last): 
    File "First.py", line 3, in <module> 
    regex = re.compile(r'((?:[a-zA-Z0-9])\1+)') 
    File "C:\Users\bhatsubh\AppData\Local\Programs\Python\Python35\lib\re.py", lin 
e 224, in compile 
    return _compile(pattern, flags) 
    File "C:\Users\bhatsubh\AppData\Local\Programs\Python\Python35\lib\re.py", lin 
e 293, in _compile 
    p = sre_compile.compile(pattern, flags) 
    File "C:\Users\bhatsubh\AppData\Local\Programs\Python\Python35\lib\sre_compile 
.py", line 536, in compile 
    p = sre_parse.parse(p, flags) 
    File "C:\Users\bhatsubh\AppData\Local\Programs\Python\Python35\lib\sre_parse.p 
y", line 829, in parse 
    p = _parse_sub(source, pattern, 0) 
    File "C:\Users\bhatsubh\AppData\Local\Programs\Python\Python35\lib\sre_parse.p 
y", line 437, in _parse_sub 
    itemsappend(_parse(source, state)) 
    File "C:\Users\bhatsubh\AppData\Local\Programs\Python\Python35\lib\sre_parse.p 
y", line 778, in _parse 
    p = _parse_sub(source, state) 
    File "C:\Users\bhatsubh\AppData\Local\Programs\Python\Python35\lib\sre_parse.p 
y", line 437, in _parse_sub 
    itemsappend(_parse(source, state)) 
    File "C:\Users\bhatsubh\AppData\Local\Programs\Python\Python35\lib\sre_parse.p 
y", line 524, in _parse 
    code = _escape(source, this, state) 
    File "C:\Users\bhatsubh\AppData\Local\Programs\Python\Python35\lib\sre_parse.p 
y", line 415, in _escape 
    len(escape)) 
sre_constants.error: cannot refer to an open group at position 16 

誰かが私を導いてください間違っている。あなたは(おそらく)

([a-zA-Z0-9])\1+ 

をしたい

答えて

2

a demo on regex101.comを参照してください。 Python


import re 
line = "..12345678910111213141516171820212223" 
regex = re.compile(r'([a-zA-Z0-9])\1+') 

matches = [match.group(0) for match in regex.finditer(line)] 
print (matches) 
# ['111', '222'] 
+0

はい、それはfindallでは機能しません。繰り返しグループの最初の文字を表示するだけです。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ:それで、私はいくつかのコードを追加しました(リスト内包表記を使用しています)。 – Jan

+1

Nice、upvote from me ... –

2

グループ基準は別のグループの中に発見することができません。あなたがしたいすべてがそれらの繰り返し文字をプリントアウトしている場合は、そこre.subで、あなたが使用することができ、小さなハックです:それは.findallでこれを行うことは可能

def foo(m): 
    print(m.group(0)) 
    return '' 

_ = re.sub(r'(\w)\1+', foo, line) # use [a-zA-Z0-9] if you don't want to match underscores 
111 
222 
+1

どちらか悪い: – Jan

+0

@Janありがとう!あなたのものはハッキリではありませんが、私はそれ以上のものが好きです。 –

+0

OPが決定するものです、私は思います。 – Jan

1

が、それは.finditerでそれを行うには簡単です、 Janの答えに示されているように。

import re 

line = "..12345678910111213141516171820212223" 
regex = re.compile(r'(([a-zA-Z0-9])\2+)') 

matches = [t[0] for t in regex.findall(line)] 
print(matches) 

出力

['111', '222'] 

\1が外側括弧内のパターンを参照し\2が内側括弧内のパターンを意味するので、我々は、\2を使用します。

関連する問題