2013-03-05 11 views
6

Sono molto nuovo a Python, infatti questo è il mio primo script.Python re.sub() stranezza

Sono alle prese con le espressioni regolari di Python. In particolare re.sub()

Ho il seguente codice:

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

Con questo sto cercando di abbinare qualcosa come host": "${9:example.com}" all'interno searchString e sostituirlo example.com con un nome server o l'indirizzo IP.

Se variableTest contiene un IP, non riesce. Ottengo il seguente errore: sre_constants.error: invalid group reference

ho provato con variableTest uguale a "127.0.0.1", "1", "192", "192.168". "127.0.0.1" funziona mentre il resto no. Se io antepongo gli altri con una lettera, funziona anche.

variableTest è una stringa - verificata con type(variableTest)

Sono totalmente perso perché questo è.

Se rimuovo r'\1' nella stringa di sostituzione funziona anche. r'\1' contatterà ${\d}:, con \d un numero compreso tra 1 e 999.

Qualsiasi aiuto sarà molto apprezzato!

+1

Si noti che mentre il post di nneonneo fornisce la risposta effettiva al problema, anche l'osservazione di PurityLake sulla propria chiamata di comando è vera: si sta effettivamente impostando l'argomento opzionale 'count' con il flag' re.M'. – cooltea

risposta

8

Il problema è che mettere un IP in variableTest si tradurrà in una stringa di sostituzione come questo:

r'\18.8.8.8\2' 

Come si può vedere, il primo riferimento del gruppo è quello di gruppo 18, non gruppo 1. Quindi, re lamenta circa il riferimento di gruppo non valido.

In questo caso, si desidera utilizzare la \g<n> syntax invece:

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

che produce per esempio r'\g<1>8.8.8.8\g<2>'.

+0

Questo funziona. Grazie mille! La regex di Python è strana :) Leggerò più avanti sulla sintassi collegata. – tone7

1

re.sub (pattern, repl, string, count = 0, flags = 0)

Questa è la sintassi per re.sub()

Il modo in cui sembra essere chiamando la bandiera re .M, dovrebbe essere come bandiere = re.M, altrimenti Python lo prenderà come se si intende che count = re.M

fare un tentativo in quanto è l'unica cosa che posso decidere

anche dare un esempio di ciò che la tua variabile searchString potrebbe contenere

+0

Quando uso 'flags = re.M' invece di solo' re.M' ottengo il seguente errore "sub() ha un argomento di parole chiave inaspettato 'flags'" 'test = re.sub (r '(\ $ \ {\ d {1,2} \ :) esempio.it (\}) ', r' \ 1 '+ variableTest + r' \ 2 ', searchString, flags = re.M) ' – tone7

+0

L'argomento di input opzionale' flags' in 're.sub' è stato introdotto in Python 2.7. Il messaggio di errore che ottieni probabilmente viene visualizzato perché stai utilizzando una versione precedente di Python. Controlla [re.compile] (http://docs.python.org/2/library/re.html#re.compile) per ulteriori dettagli sull'uso di 're.M' – cooltea