2016-11-05 8 views
1

数字(0〜9)、文字(A〜Z)、角括弧( "()"を含む文字列があります。角括弧が含まれている場合は、角かっこと数字(または文字)を一緒に扱う必要があります。例えば、「(G)8(8)(G)4(C)(G)8(8)」または「(2)2(6)2(6)2(2)2(8)そして、私はこの文字列でパターンを見つける必要があります(重複しない)。ここで、文字列は、それが2回以上発生することを意味します。例えばPythonの文字列でパターンを見つける

"(2)2(6)2(6)2(2)2(8)" 

を取り、彼らが二回発生しているため、私は抽出するパターンは、

"2(6)", "(2)2" and "(6)2" 

です。文字列

"(G)8(8)(G)4(C)(G)8(8)" 

、私は

"(G)8(8)" 

を抽出することができます。私はre.compile(r "(。+?)\ 1 +")を知っています。findall(string)、この関数はパターンを見つけることができますが、私の状況には適用できません。誰でも助けてくれますか?ありがとうございました。

+0

用語を定義するためのパターンは何ですか? '(word | digit)digit(word | digit)digit ....'または 'digit(word | digit)digit ...'というルールに従っていますか? – Enix

+0

私はパターン ")2(6"は受け入れられません、括弧と数字(または文字)を一緒にする必要があります – pc101

+0

2番目の文字列もあなたの要件を満たす '8(8) ? –

答えて

0

文字列に2回現れるので、2番目の文字列には、ユーザの要件を満たす8(8)値も含まれているようです。

あなたが求めてマッチが重複することができますので、あなたがアンカーされない肯定先読み内部のキャプチャグループが必要です。

(?=((?:\([A-Z0-9]+\)|\d){2,}).*\1) 

regex demoを参照してください。ここで

は、((?:\([A-Z0-9]+\)|\d){2,})はグループ1 ( +大文字のASCII文字や数字、1以上+ )または数字(\d)の2つ以上の配列の中に取り込みます。 \1には、0以上の任意の文字の後に同じ値を指定する必要があります(複数の行をチェックする必要がある場合はre.S修飾子を追加してください)。ここで

online Python demo次のとおりです。

import re 
ss = ['(2)2(6)2(6)2(2)2(8)', '(G)8(8)(G)4(C)(G)8(8)'] 
r = r'(?=((?:\([A-Z0-9]+\)|\d){2,}).*\1)' 
for s in ss: 
    print(s) 
    print(re.findall(r, s)) #print([x.group(1) for x in re.finditer(r, s)]) 
    print("---------") 

出力: `グループtogether`:

(2)2(6)2(6)2(2)2(8) 
['(2)2', '2(6)', '(6)2'] 
--------- 
(G)8(8)(G)4(C)(G)8(8) 
['(G)8(8)', '8(8)'] 
---------