2017-01-12 5 views
-2

文字列値のリストと照合する必要があります。Pythonの正規表現の変数にOR演算子(|)を使用する

import re 
line='GigabitEthernet0/1 is up, line protocol is up' 
interfacenames=[ 
       'Loopback', 
       'GigabitEthernet' 
       ] 
rex="r'" + '|'.join(interfacenames) + "'" 
print rex 
interface=re.match(rex,line) 
print interface 

コード結果は次のとおりです:

r'Loopback|GigabitEthernet' 
None 

しかし、私は直接文字列を過ぎてコピーした場合re.matchに渡される刺さを構築するために.join()|「」私が使用しています試合:

interface=re.match(r'Loopback|GigabitEthernet',line) 

それは動作します:

r'Loopback|GigabitEthernet' 
<_sre.SRE_Match object at 0x7fcdaf2f4718> 

私はrexの.joinを実際の "Loopback | GigabitEthernet"に置き換えようとしましたが、どちらもうまくいきませんでした。それは、パイプシンボルが文字列から渡されたときに演算子として扱われないようです。 これを修正する方法はありますか?

+0

この場合、生の接頭辞は無意味です。問題は、生成された正規表現に簡単な引用符が含まれていることです。それらを削除してください: 'rex = '|' .join(interfacenames)' –

+0

あなたはテストをしたときに同じ文字列をコピー/ペーストしませんでした。それは 're.match(" r'Loopback | GigabitEthernet '"、行)'でなければなりません。 – melpomene

+0

ありがとうございます。私はいつかそれを試してみたが、明らかに何か間違ったことをした。それは完全に動作します。 – lem

答えて

2

接頭辞r'を文字列リテラルの一部として使用します。これは、使用することができる方法である:

また
rex=r'|'.join([re.escape(x) for x in interfacenames]) 

、あなたの場合:interfacenamesは、特別な正規表現のメタ文字が含まれている。このような値をエスケープする場合

rex=r'|'.join(interfacenames) 

Python demo

を参照してください。文字列の先頭だけでなく、re.matchではなくre.searchを使用してください。 What is the difference between Python's re.search and re.match?

1

"r'"を最初に、"'"を入力する必要はありません。これは、リテラルの生の文字列の構文の一部です。文字列自体の一部ではありません。

関連する問題