2012-03-27 9 views
18

Powiedz, mam ciągJak używać wyrażenia regularnego z opcjonalnymi znakami w pythonie?

"3434.35353" 

i inny ciąg

"3593" 

Jak zrobić jedno wyrażenie regularne, który jest w stanie dopasować zarówno beze mnie konieczności ustawić wzór do czegoś innego, jeśli inne zawiedzie? Wiem, że \d+ pasowałoby do 3593, ale nie zrobiłoby to nic dla 3434.35353, ale (\d+\.\d+) pasowałoby tylko do tego z dziesiętnym i nie powiodło się żadne dopasowanie znalezione dla 3593.

Spodziewam m.group(1) powrotu:

"3434.35353" 

lub

"3593" 

Odpowiedz

32

Możesz umieścić ? po grupą znaków, aby to opcjonalne.

Chcesz kropkę, a następnie dowolną liczbę cyfr \.\d+, zgrupowanych razem (\.\d+), opcjonalnie (\.\d+)?. Trzymać się, że w swojej strukturze:

import re 
print re.match("(\d+(\.\d+)?)", "3434.35353").group(1) 
3434.35353 
print re.match("(\d+(\.\d+)?)", "3434").group(1) 
3434 
1

Użyj "jeden lub zero" kwantyfikator, ?. Twój regex staje się: (\d+(\.\d+)?).

Więcej informacji na temat różnych dostępnych kwantyfikatorów i sposobu ich użycia można znaleźć w rozdziale 8 dokumentu TextWrangler manual.

3

To wyrażenie regularne powinno działać:

\d+(\.\d+)? 

odpowiada jednemu lub więcej niż cyfry (\d+), a następnie ewentualnie przez kropki i jeden lub więcej znaków ((\.\d+)?).

0

Przeczytaj w bibliotece Python RegEx. Link odpowiada na twoje pytanie i wyjaśnia, dlaczego.

Jednak, aby dopasować cyfrę następnie więcej cyfr z opcjonalną przecinku, można użyć

re.compile("(\d+(\.\d+)?)") 

W tym przykładzie? po przechwyceniu grupy .\d+ określa, że ​​ta część jest opcjonalna.

Example

Powiązane problemy