2016-05-20 11 views
1

私は文字列に繰り返しパターンをキャッチしようとしています。サブパターンは、単語の先頭、つまり":"で始まり、末尾が":"で終わります。私は((subpattern)__(subpattern))+に一致する複数の組み合わせでfindallsearchを試みたが、何が間違っていることができませんでした:正規表現の繰り返しパターン

cc = "GT__abc23_1231:TF__XYZ451" 

import regex 
ma = regex.match("(\b|\:)([a-zA-Z]*)__(.*)(:|\b)", cc) 

予想される出力:

GT, abc23_1231, TF, XYZ451 

私はthisのような質問をたくさん見ましたが、それは助けにはなりませんでした。

+0

を、あなたは 'インポートre'を意味するか、あなたがしようとした正規表現が含まれているため –

+1

あなたの要件が不明確である' __'、いくつかの文字にマッチし、 '? 。* '0 '個のものと一致します。正確にお聞かせください。' _ 'は単語文字で、' T'と '_ 'の間に' \ b'はありません –

+0

最初に分割したい:二重のアンダースコアで分割します。私は引用された質問で推奨されるように 'regex'をインポートします。 –

答えて

2

あなたがregex demo

パターンがの詳細を参照してください

(?:[^_:]|(?<!_)_(?!_))+ 

を使用することができそうです:

  • (?:[^_:]|(?<!_)_(?!_))+ - の1以上の配列:
    • [^_:] - 任意の文字が、_:
    • (?<!_)_(?!_) - 他_

Python demo with re based solutionで囲まれていない単一_

import re 
p = re.compile(r'(?:[^_:]|(?<!_)_(?!_))+') 
s = "GT__abc23_1231:TF__XYZ451" 
print(p.findall(s)) 
# => ['GT', 'abc23_1231', 'TF', 'XYZ451'] 

最初の文字は常に:とされていない場合_のようにan unrolled regexを使用してください:

r'[^_:]+(?:_(?!_)[^_:]*)*' 

ただし、これは単一の_で始まる値と一致しません(したがって、展開されていない正規表現はより安全です)。

2

で最小公分母を使用し、「開始をして:またはワード境界で終わる」、それはワード境界(あなたの部分文字列が単語文字で構成されている)です:

>>> import re 
>>> cc = "GT__abc23_1231:TF__XYZ451" 
>>> re.findall(r'\b([A-Za-z]+)__(\w+)', cc) 
[['GT', 'abc23_1231'], ['TF', 'XYZ451']] 

:があるかどうか調べることは役に立たない。
(注:。\w+\bを追加する必要が、数量詞は貪欲であることから、ワード境界が暗黙的になり)


[EDIT]

あなたのコメントによると:"私は最初に分割したい:"、その後二重のアンダースコアで分割する。「、あなたがすべてで正規表現必要いけないかもしれない:あなたの質問のコードでは

>>> [x.split('__') for x in cc.split(':')] 
[['GT', 'abc23_1231'], ['TF', 'XYZ451']] 
関連する問題