2017-10-25 56 views
5

Mam ciąg, który może się różnić, ale zawsze będzie zawierał x={stuffNeeded}.Zwróć ciąg znaków w ciągu znaków na podstawie wyrażenia 'x = {(. *)}'

Na przykład: n=1,x={y,z,w},erore={3,4,5} lub x={y,z,w} lub erore={3,4,5},x={y,z,w} itp

Mam diabeł czasu na zastanawianie się, jak dostać się y,z,w. Najbliżej znajdowałem odpowiedź opartą na odpowiedzi Yathartha na ten inny wpis Regular expression to return all characters between two special characters.

To moje poszukiwanie, do tej pory natknąłem się na coś, co prawie zadziałało. Testowanie zostało wykonane tutaj http://rubular.com/r/bgixv2J6yF oraz w pythonie.

ten został przetestowany w Pythonie przy użyciu:

i='n=1,x={y,z,w},erore={3,4,5}' 
j='n=1,x={y,z,w}' 
print re.search('x={(.*)}',i).group(1) 
print re.search('x={(.*)}',j).group(1) 
print re.search('x={(.*)}.',i).group(1) 
print re.search('x={(.*)}.',j).group(1) 

wynik dla czterech różnych druku:

'y,z,w' 
'y,z,w},erore={3,4,5' 
AttributeError: 'NoneType' object has no attribute 'group' 
'y,z,w' 

Potrzebne wynik jest 'y,z,w' dla wszystkich przypadków, a następnie, jeśli x={*} naprawdę nie zostanie znaleziony chciałbym wstawić błąd catch.

Z góry dziękuję.

+2

jest 'x = {YZ, w} "literówka? –

+0

Wzniesiono pod hasłem "diabeł czasu": D –

+0

@ Ev.Kounis: to na pewno był literówka. Dzięki –

Odpowiedz

6

Ten regex robi to, co starasz się zrobić:

regex = r'x={([^\}]*)}' 

żywo demo here

Wyjaśnienie

  • {([^\}]*): szukać uchwytem otwierającym, a następnie szukać dla (i przechwytuj) dowolną liczbę obiektów characte innych niż } rs. Tak więc twoja grupa 1 będzie zawierać przechwycone wartości dla x.
  • }: patrzeć na wsporniku zamknięcia
3

Głównym problemem jest to, że {(.*)} mecze najdłuższy łańcuch rozpoczynający przez { i kończący przez }, która w niektórych przypadkach jest y,z,w},erore={3,4,5

Można używać non dopasowywanie przez dodanie ?. Nie potrzebujesz żadnego innego przypadku.

import re 

i='n=1,x={y,z,w},erore={3,4,5}' 
j='n=1,x={y,z,w}' 
expr = 'x={(.*?)}' 
print (re.search(expr,i).group(1)) 
print (re.search(expr,j).group(1)) 

Wynik:

y,z,w 
y,z,w 
1

Korzystanie re.findall:

>>> import re 
>>> re.findall('x={[^\}]*}', s) 

wartości #driver:

IN : s = 'n=1,x={y,z,w},erore={3,4,5}' 
OUT : ['x={y,z,w}'] 

IN : s = 'n=1,x={y,z,w}' 
OUT : ['x={y,z,w}'] 

IN : s = 'x={y,z,w}' 
OUT : ['x={y,z,w}'] 

teraz, aby uzyskać wartość x, y, z użyć split i strip:

>>> l = re.findall('x={[^\}]*}', s) 

#if `l` is not empty 
>>> out = l[0] 
=> 'x={y,z,w}' 

>>> y, z, x = out.strip('x={}').split(',') 
>>> y, z, x 
=> ('y', 'z', 'w') 
1

Można spróbować to:

import re 
s = 'n=1,x={y,z,w},erore={3,4,5}' 
final_data = re.findall('=\{(.*?)\}', s) 

wyjściowa:

['y,z,w', '3,4,5']