2017-01-12 5 views
-2

Ich muss mit einer Liste von Zeichenfolge Werten übereinstimmen. Ich bin mit '|' .join() einen Stachel zu bauen, die in re.match geben wird:mit OR-Operator (|) in Variable für regulären Ausdruck in Python

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 

Der Code Ergebnis ist:

r'Loopback|GigabitEthernet' 
None 

Allerdings, wenn ich an den String direkt kopieren in Übereinstimmung:

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

Es funktioniert:

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

Ich habe versucht, .join in rex mit "Loopback | GigabitEthernet" zu ersetzen und es hat auch nicht funktioniert. Es sieht so aus, als ob das Pipe-Symbol nicht als Operator behandelt wird, wenn es von String übergeben wird. Irgendwelche Gedanken, wie man es repariert?

+0

das rohe Präfix ist in diesem Fall nutzlos. Problem ist, dass Ihre generierte Regex einfache Anführungszeichen enthält. Entferne sie: 'rex = '|' .join (Interface-Namen)' –

+0

Du hast den gleichen String nicht kopiert/eingefügt, als du deinen Test gemacht hast. Es müsste 're.match (" r'Loopback | GigabitEthernet '", line)' sein. – melpomene

+0

Danke. War sicher, dass ich es irgendwann einmal versucht habe, aber eindeutig etwas falsch gemacht hat. Es funktioniert perfekt. – lem

Antwort

2

Sie verwenden das Präfix r' als Teil eines Zeichenfolgenliterals. Dies ist, wie es verwendet werden könnte:

rex=r'|'.join(interfacenames) 

Siehe Python demo

Wenn die interfacenames spezielle Regex Metazeichen enthalten kann, die Werte wie folgt entkommen:

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

Auch, wenn Sie Planen Sie, die Zeichenfolgen nicht nur am Anfang der Zeichenfolge abzustimmen, sondern re.search und nicht re.match. Siehe What is the difference between Python's re.search and re.match?

1

Sie müssen "r'" am Anfang und "'" nicht setzen. Das ist Teil der Syntax für literale rohe Zeichenketten, es ist nicht Teil der Zeichenkette selbst.

rex = '|'.join(interfacenames)