Edit2: It wasn't clear if your test data
contained pipes or not. I saw the pipes in
the regex and assumed you are searching
for pipe delim. Oh well.. not sure if below
helps.
ピックアップしてより多くの交替が必要になりますパイプ区切りのテキストを一致させるために正規表現を使用しました開始列と終了列。
別のアプローチはどうですか?
text='start piston|xxx|piston ring|xxx|piston cast|xxx|piston|xxx|stock piston|piston end'
j=re.split(r'\|',text)
k = [ x for x in j if x.find('piston') >= 0 ]
['start piston', 'piston ring', 'piston cast', 'piston', 'stock piston', 'piston end']
k = [ x for x in j if x.startswith('piston') ]
['piston ring', 'piston cast', 'piston', 'piston end']
k = [ x for x in j if x == 'piston' ]
['piston']
j=re.split(r'\|',text)
if 'piston ring' in j:
print True
> True
編集:明確にする - この例を取る: ''
=テキスト2 'piston1 | XXX | spiston2 | XXX |ピストンリング| | XXX piston3'
私が追加一致するアイテムを表示するために一致するもの
re.findall('piston.',text2)
['piston1', 'piston2', 'piston ', 'piston3']
もっと正確にするためには、ルックアヘッドアサーションを使用する必要があります。 これは、あなたが一致保証「|ピストン」は貪欲から最初に一致した文字に一致する結果
re.findall('(?<=\|)piston.',text2)
['piston ', 'piston3']
リミットにパイプが含まれていませんか*。? <ストップ・キャラクタ> パイプを除外するためにグループ化の括弧を追加してください。試合 。*?グループ内であるかどうかを検出するのに十分にスマートで、括弧を無視し、次の文字を停止マッチングのセンチネルとして使用します。これはうまくいくようですが、最後の列は無視されます。
re.findall('(?<=\|)(piston.*?)\|',text2)
['piston ring']
あなたはあなたが今だけ指定することができ、グループ化の追加だけでなく、最後の列を検索し、この非グループ化一致を追加するには、エスケープパイプ
re.findall('\|(piston.*?)\|',text2)
['piston ring']
で始まる(?:\ || $) - パイプ上でマッチすること(エスケープする必要がある)か、文字列の最後($)であることを意味します。 グループ化されていない一致(?:x1 | x2)は結果に含まれません。追加ボーナスは最適化されます。
re.findall('\|(piston.*?)(?:\||$)',text2)
['piston ring', 'piston3']
最後に、最後の文字列一致
re.findall('(?:\||^)(piston.*?)(?:\||$)',text2)
['piston1', 'piston ring', 'piston3']
のためにずっと以前のもののような他の変更を追加し、文字列の先頭のために固定して、それがお役に立てば幸いです。 :)
正規表現の貪欲は '*'と '+ '演算子を使っているときにのみ有効です。 '|'は左から右へ最初のマッチを使います。 – resmon6