2011-12-12 19 views
6

İki eğik çizgi arasında düzenli ifadelerle eşleşen normal bir ifade oluşturmaya çalışıyorum. Benim asıl sorunum, düzenli ifadelerin, ters eğik çizgi ile kaçan ileri eğik çizgi içermeleridir. Negatif bir lookbehind iddiasıyla filtrelemeye çalışıyorum (sadece şu anki pozisyonda herhangi bir geri tepme yoksa kapanma eğrisi ile eşleşir), ancak şimdi regex'in kendisinde olmama problemi yaşıyorum. aslında kaçtı bir ters eğik çizgi ile biter.Normal ifade: Dizgenin kendisi kaçan eğik çizgi içeriyorsa iki eğik çizgi arasındaki dizeyi eşleştirin

test programı:

#!/usr/bin/python 
import re 
teststrings=[ 
    """/hello world/""", 
    """/string with foreslash here \/ and here\//""", 
    """/this one ends with backlash\\\\/"""] 

patt="""^\/(?P<pattern>.*)(?<!\\\\)\/$""" 

for t in teststrings: 
    m=re.match(patt,t) 
    if m!=None: 
     print t,' => MATCH' 
    else: 
     print t," => NO MATCH" 

çıkışı:

/hello world/ => MATCH 
/string with foreslash here \/ and here\// => MATCH 
/this one ends with backlash\\/ => NO MATCH 

nasıl iki yalnızca geçerli konumda tek boşluk varsa vurmak için iddiasını değiştirebilir ama değil mi?

Ya da normal ifadeleri ayıklamak için daha iyi bir yolu var mı? (Gerçek dosyasında ben çizgiler sadece regex daha içerirler ayrıştırmak deneyin Not ben sadece satır başına ilk ve son eğik çizgi aramak ve inbetween her şeyi elde edemez..)

+0

, sen kaçabilirdi eğik çizgi? –

+0

Evet, regex sonra dize – Gryphius

cevap

16

bu deneyin:

pattern = re.compile(r"^/(?:\\.|[^/\\])*/") 

Açıklama: sizin "gerçek dünya" uygulama için

^  # Start of string 
/  # Match/
(?:  # Match either... 
\\. # an escaped character 
|  # or 
[^/\\] # any character except slash/backslash 
)*  # any number of times. 
/  # Match/

(kaçan eğik çizgi bakılmaksızın ilk "çizgi ile ayrılmış dize" bulma), Kullanayım

pattern = re.compile(r"^(?:\\.|[^/\\])*/((?:\\.|[^/\\])*)/") 

Bu size aşağıdaki alır:/sonra "gerçek" ilk/son çizgi önce gerçek dünya örneğinde

>>> pattern.match("foo /bar/ baz").group(1) 
'bar' 
>>> pattern.match("foo /bar\/bam/ baz").group(1) 
'bar\\/bam' 
>>> pattern.match("foo /bar/bam/ baz").group(1) 
'bar' 
>>> pattern.match("foo\/oof /bar\/bam/ baz").group(1) 
'bar\\/bam' 
+2

slashes de dahil olmak üzere keyfi karakterler olabilir Ben benden kaçan bir karakteri eşleştirmek için \\. – interjay

+0

Oops. Evet teşekkürler. Düzenleme ... –

+0

Mükemmel! çok teşekkürler! – Gryphius

İlgili konular