2009-10-29 17 views
11

Próbuję użyć wyrażeń regularnych w języku Python, aby znaleźć wyrażenie matematyczne w ciągu znaków. Problem polega na tym, że ukośnik naprzód wydaje się robić coś nieoczekiwanego. Pomyślałbym, że [\w\d\s+-/*]* będzie działało do wyszukiwania wyrażeń matematycznych, ale z jakiegoś powodu znajduje również przecinki. Trochę eksperymentów ujawnia, że ​​ukośniki naprzód są winowajcą. Na przykład:Ukośnik naprzód w regex Python

>>> import re 
>>> re.sub(r'[/]*', 'a', 'bcd') 
'abacada' 

Widocznie ukośniki meczu pomiędzy znakami (nawet gdy jest w klasie znaków, ale tylko wtedy, gdy gwiazdka jest obecny). Ukośniki nie uciekają. Polowałem przez jakiś czas i nie znalazłem żadnej dokumentacji na ten temat. Jakieś wskazówki?

Odpowiedz

19

Sprawdzić here for documentation na module re Pythona.

myślę, że nie jest /, ale raczej - w swojej pierwszej klasy postaci: [+-/] mecze +, / i dowolną wartość pomiędzy ASCII, które zdarzają się na to przecinek.

Może to wskazówka z pomocą docs:

Jeśli chcesz dołączyć do „]” lub „-” wewnątrz zestawu, należy poprzedzić go odwrotnym ukośnikiem, lub umieścić go jako pierwszy znak.

+0

RTFM nie jest akceptowalną odpowiedzią. Pozostałe odpowiedzi są poprawne. –

7

Mówisz, że chcesz zastąpić zero lub więcej ukośników za pomocą 'a'. Tak więc zastępuje ona każdą "bez znaku" za pomocą 'a'. :)

Prawdopodobnie oznaczało [/]+, tj. Jeden lub więcej ukośników.

EDYTOWANIE: Przeczytaj Ber's answer, aby znaleźć rozwiązanie pierwotnego problemu. Nie dość dokładnie przeczytałem całe pytanie.

2

r '[/] *' oznacza "Dopasuj 0 lub więcej ukośników". Występuje dokładnie 0 ukośników w przód pomiędzy "b" & "c" i między "c" & "d". Stąd te mecze są zamieniane na "a".

2

Parametr * dopasowuje swój argument zero lub więcej razy, dopasowując w ten sposób pusty ciąg. Pusty łańcuch jest (logicznie) między dowolnymi dwoma kolejnymi znakami. Stąd

>>> import re 
>>> re.sub(r'x*', 'a', 'bcd') 
'abacada' 

chodzi o ukośnikiem, to nie otrzyma specjalnego traktowania:

>>> re.sub(r'/', 'a', 'b/c/d') 
'bacad' 

documentation opisuje składnię wyrażeń regularnych w Pythonie. Jak widać, ukośnik nie ma żadnej specjalnej funkcji.

Powodem że [\w\d\s+-/*]* znajdzie również przecinkami'S, dlatego w nawiasach kwadratowych, kreska - oznacza zakres. W tym przypadku nie chcesz wszystkich znaków między + i /, ale literalnych znaków +, - i . Więc piszcie myślnik jako ostatni znak: [\w\d\s+/*-]*. To powinno to naprawić.