2013-02-23 17 views
5

Ho bisogno di ottenere alcune parole da una stringa in un nuovo formato. Per esempio, che io chiamo la funzione con l'ingresso:ottenere string tra 2 caratteri in python

text2function('$sin (x)$ is an function of x') 

e ho bisogno di metterli in una stringFunction:

StringFunction(function, independent_variables=[vari]) 

in cui ho bisogno di ottenere solo 'sin (x)' per la funzione e 'x' per vari. Quindi sembrerebbe questo alla fine:

StringFunction('sin (x)', independent_variables=['x'] 

il problema è che non riesco a ottenere funzioni e vari. Ho provato:

start = string.index(start_marker) + len(start_marker) 
end = string.index(end_marker, start) 
return string[start:end] 

e

r = re.compile('$()$') 
m = r.search(string) 
if m: 
    lyrics = m.group(1) 

e

send = re.findall('$([^"]*)$',string) 

tutto sembra a me sembra dare nulla. Sto facendo qualcosa di sbagliato? Tutto l'aiuto è apprezzato. Grazie.

risposta

6

$ è un carattere speciale nella regex (indica la fine della stringa). È necessario sfuggire:

>>> re.findall(r'\$(.*?)\$', '$sin (x)$ is an function of x') 
['sin (x)'] 
2

è necessario iniziare a cercare il secondo carattere oltrestart:

end = string.index(end_marker, start + 1) 

perché altrimenti troverete lo stesso personaggio nella stessa posizione di nuovo:

>>> start_marker = end_marker = '$' 
>>> string = '$sin (x)$ is an function of x' 
>>> start = string.index(start_marker) + len(start_marker) 
>>> end = string.index(end_marker, start + 1) 
>>> string[start:end] 
'sin (x)' 

Per le espressioni regolari, il carattere $ viene interpretato come un ancho r, non il carattere letterale. Fuga per abbinare letterale $ (e cercare le cose che sono non$ invece di non ":

send = re.findall('\$([^$]*)\$', string) 

che dà:

>>> import re 
>>> re.findall('\$([^$]*)\$', string) 
['sin (x)'] 

L'espressione regolare $()$ altrimenti non realmente corrisponde qualsiasi cosa tra parentesi anche se hai sfuggito ai caratteri $.

5

Tweeky way !

>>> char1 = '(' 
>>> char2 = ')' 
>>> mystr = "mystring(123234sample)" 
>>> print mystr[mystr.find(char1)+1 : mystr.find(char2)] 
123234sample 
+1

Mi piace molto questa soluzione per quello che sto facendo. – Jiminion