2016-10-18 6 views
2

これまでの正規表現は次のとおりです。このRegEx以上を使用したい情報をどのように抽出できますか?

r"(?s)(?<=([A-G][1-3])).*?(?=[A-G][1-3]|$)"

それは-Gと1-3間の数だけでなく、先に見たときに同じことをやって続い手紙のための後ろに見えます。私はRegex101を使ってテストしました。 Here's what it returns for each match

これは私がに対してそれをテストしていた文字列は、ある

"A1 **ACBFEKJRQ0Z+-** F2 **.,12STLMGHD** F1 **9)(** D2 **!?56WXP** C1 **IONVU43\"\'** E1 **Y87><** A3 **-=.,\'\"!?><()@**" 

(文字列にスペースを持つべきではないが、私はそれがあるので、番号が続く各文字間の値をボールドするために必要な

私がしたいことは、グループの一致(「完全一致」)と、それらが一致するグループの一致を後で使用するために保存することです。私はタプルのリストまたは例えば辞書のいずれかで終わるしたい最後に

dict = {"A1":"ACBFEKJRQ0Z+-", "F2":",12STLMGHD", "F1":"9)(", "next group match":"characters that follow"} 

または

list_of_tuples = (["A1","ACBFEKJRQ0Z+-"], ["F2","12STLMGHD"], ["F1","9)("], ["next group match","characters that follow"]) 

文字列が正規表現と比較されるとは限りません"C1F2"のようなものがあります。btw

PS regex demo

(?s)([A-G][1-3])は、グループ1に大文字+数字をキャプチャします、改行を一致させるために.が可能になります参照してくださいひどい説明すみません、任意のヘルプは大幅

+1

[ '(S?)([AG] [1-3])((とhttp://ideone.com/kvL59Fような何か:??!([AG] [1-3])。)*) '](https://regex101.com/r/xlC4tZ/1)? –

答えて

1

を高く評価している私は

(?s)([A-G][1-3])((?:(?![A-G][1-3]).)*) 

を提案((?:(?![A-G][1-3]).)*)は、大文字+数字シーケンスを開始していないすべてのテキストと一致します。

パフォーマンス向上のため、同じ正規表現を([A-G][1-3])([^A-G]*(?:[A-G](?![1-3])[^A-G]*)*)として展開することができます(re.DOTALL修飾子なし、または(?s)が必要です)。 this demoを参照してください。

import re 
regex = r"(?s)([A-G][1-3])((?:(?![A-G][1-3]).)*)" 
test_str = """A1 ACBFEKJRQ0Z+-F2.,12STLMGHDF19)(D2!?56WXPC1IONVU43"'E1Y87><A3-=.,'"!?><()@""" 
dct = dict(re.findall(regex, test_str)) 
print(dct) 
+0

ありがとう、これは素晴らしいです:D – Callum

+1

'?:(?![AG] [1-3]))*'は[テンダードグリーディトークン](http://stackoverflow.com/a/37343088/3832970)、一連の文字にマッチする必要がある場合に便利です。長い文字列の場合は展開されていないバージョン、短い文字列の場合は簡潔なバージョンを使用することをお勧めします。 –

+0

あなたが気付いた場合、すべての英数字といくつかの記号がその文字列に識別子(A1、F2、C1、A3など)を加えたものに含まれています。私はADFGVX Cipherのようなものを作ろうとしているので、データを分割する方法が必要でした。すべての助けをありがとう! – Callum

関連する問題