2013-12-09 3 views
7
x = r"abc" 
y = r"def" 
z = join([x,y], "|") 

z # => r"r\"abc\"|r\"def\"" 

Gibt es eine Möglichkeit zu join (und in der Regel manipulieren) Regex, die nur mit dem regex Inhalt befasst sich Joining (das heißt nicht behandeln die r Modifikator, als ob es ein Teil des Inhalts ist). Die gewünschte Ausgabe für z ist:reguläre Ausdrücke in julia

z # => r"abc|def" 
+0

Was ist der Ausgang Sie bekommen? –

+0

@UriMikhli Es ist die letzte Zeile im ersten Codeblock. –

+1

Nun, es gibt 'Regex (join ([x.pattern, y.pattern]," | "))', aber das ist nicht sehr hübsch, und ich weiß nicht, wie es sich in komplexeren Fällen verhalten würde. – DSM

Antwort

5
macro p_str(s) s end 
x = p"abc" 
y = p"def" 
z = Regex(join([x,y], "|")) 

Der r „Zitat“ Operator stellt tatsächlich einen regulären Ausdruck für Sie, die Zeit in Anspruch nimmt. Wenn Sie nur Teile eines regulären Ausdrucks haben, die Sie zum Erstellen eines größeren verwenden möchten, sollten Sie die Teile mit "normalen Anführungszeichen" speichern.

Aber was ist mit den skizzenhaften Entweichen Regeln, die Sie mit r "Zitat" im Vergleich zu "regulären Anführungszeichen" Sie fragen? Wenn Sie das skizzenhaft r „Zitat“ Regeln wollen, aber nicht einen regulären Ausdruck kompilieren sofort dann können Sie einen Makro wie verwenden:

macro p_str(s) s end 

Jetzt haben Sie ap „Zitat“, das wie ein r „Zitat“ entkommt aber nur Gibt eine Zeichenfolge zurück.

Nicht um Thema zu gehen, aber Sie könnten eine Reihe von Zitaten für den Umgang mit kniffligen Alphabete definieren. Hier einige praktikabelsten sind:

         # "baked\nescape" -> baked\nescape 
macro p_mstr(s) s end     # p"""raw\nescape""" -> raw\\nescape 
macro dq_str(s) "\"" * s * "\"" end # dq"with quotes" -> "with quotes" 
macro sq_str(s) "'" * s * "'" end  # sq"with quotes" -> 'with quotes' 
macro s_mstr(s) strip(lstrip(s)) end # s""" "stripme" """-> "stripme" 

Wenn Sie Fragmente fertig machen können Sie tun, um Ihre beitreten und einen regulären Ausdruck machen wie:

myre = Regex(join([x, y], "|")) 

Genau wie Sie dachten.

Wenn Sie mehr erfahren möchten über das, was Mitglieder ein Objekt (wie Regex.pattern) hat versuchen:

julia> dump(r"pat") 
Regex 
    pattern: ASCIIString "pat" 
    options: Uint32 33564672 
    regex: Array(Uint8,(61,)) [0x45,0x52,0x43,0x50,0x3d,0x00,0x00,0x00,0x00,0x28 … 0x1d,0x70,0x1d,0x61,0x1d,0x74,0x72,0x00,0x09,0x00] 
+0

Danke Michael. Es scheint die Antwort auf meine Frage ist nein. Ihre Antwort enthält einige coole Sachen (ich wusste nicht einmal über 'dump()'), aber ich verstehe schon, dass ich Regexes konstruieren kann, indem ich Stringteile manipuliere und dann 'Regex()' aufruft. Das spezifische Szenario, das ich habe, ist jedoch, wenn man Regexes und nicht Strings hat. Ich denke, in diesem Fall musst du 'pattern' verwenden. –

+0

Es scheint, dass sobald Sie join() verwenden, um die p-Strings zu kombinieren, das Escaping zu dem zurückkehrt, was es normalerweise in einer Zeichenfolge wäre. Das kombinierte Muster hat also nicht die korrekte Entweichung. Ich könnte natürlich etwas vermissen, da ich Julia neu bin. –