2013-03-05 11 views
6

Python'da çok yeniyim, aslında bu benim ilk senaryomdur.Python re.sub() gariplik

Python'un düzenli ifadeleri ile uğraşıyorum. Ben searchString içinde host": "${9:example.com}" gibi bir şey eşleştirmek ve bir sunucu adı veya IP adresi ile example.com değiştirmeye çalışıyorum Bununla

variableTest = "192" 
test = re.sub(r'(\$\{\d{1,2}\:)example.com(\})', r'\1' + variableTest + r'\2', searchString, re.M) 

: Özellikle re.sub()

Aşağıdaki kod var.

variableTest bir IP içeriyorsa, başarısız olur. "1", "192", "192.168", ben variableTest eşit "127.0.0.1" ile test ettik sre_constants.error: invalid group reference

: aşağıdaki hatayı alıyorum. "127.0.0.1" geri kalanı çalışmıyorken çalışıyor. Başkalarını bir mektupla eklersem de işe yarıyor.

variableTest

bir dizedir - Tamamen bu neden olarak kayboldum type(variableTest)

ile doğrulandı.

Değiştirme dizesinde r'\1' kaldırırsam, çalışır. r'\1', \d ile 1 ve 999 arasında bir sayıya ${\d}: bildirecektir.

Herhangi bir yardım büyük takdir edilecektir!

+1

Lütfen nneonneo'nun yazdığı mesaj size sorunun gerçek cevabını verirken, PurityLake'in komut çağrınız hakkındaki notu da doğrudur: aslında isteğe bağlı "count" argümanını "re.M" bayrağıyla ayarlıyorsunuz. – cooltea

cevap

8

sorun variableTest bir IP koyarak böyle bir değiştirme dizesi neden olmasıdır: Gördüğünüz gibi

r'\18.8.8.8\2' 

, ilk grup referans grubunda 18, 1. Dolayısıyla re şikayet değil grup etmektir geçersiz grup referansı hakkında. Bu durumda

, bunun yerine \g<n> syntax kullanmak istiyorum:

r'\g<1>' + variableTest + r'\g<2>' 

örn üretir hangi r'\g<1>8.8.8.8\g<2>'.

+0

kullanımı hakkında daha fazla bilgi için [re.compile]' ı (http://docs.python.org/2/library/re.html#re.compile) kontrol edin. Çok teşekkür ederim! Python'un regexi garip :) Bağlı sözdizimini daha fazla okuyacağım. – tone7

1

re.sub (desen, repl, string, sayım = 0, bayraklar = 0)

Bu re.sub() sözdizimi şöyledir

yolu bayrak yeniden çağırarak gibi görünüyor o tek şey olarak .M i

da vermek karar verebilir re.M

denemeye = o sayımı demek sanki = re.M, aksi piton alacağız bayrakları gibi olmalıdır searchString değişkeninizin

içerdiği bir örnek
+0

"flags = re.M" ifadesini kullandığımda "re.M" yerine şu hatayı alıyorum "sub() beklenmedik bir anahtar kelime argümanı var" flags "" "test = re.sub (r '(\ $ \ {\ d {1,2} \ :) örneğin.com (\}) ', r' \ 1 '+ variableTest + r' \ 2 ', searchString, flags = re.M) ' – tone7

+0

İsteğe bağlı' arg.sub 'içindeki' flags 'isteğe bağlı giriş argümanı Python 2.7'de tanıtıldı. Muhtemelen aldığınız hata mesajı, Python'un önceki bir sürümünü kullandığınız için ortaya çıkar. 'Re.M' – cooltea