2013-05-13 20 views
5

Chcę dopasować znaki spacji lub koniec łańcucha w tekście.python regex: aby dopasować znak spacji lub koniec łańcucha

import re 


uname='abc' 
assert re.findall('@%s\s*$' % uname, '@'+uname) 
assert re.findall('@%s\s*$' % uname, '@'+uname+' '+'aa') 
assert not re.findall('@%s\s*$' % uname, '@'+uname+'aa') 

Wzór jest nieprawidłowy.
Jak korzystać z Pythona?

Odpowiedz

13

\s*$ jest niepoprawna: to pasuje do „zero lub więcej spacji następnie końcu łańcucha”, zamiast „jednym lub więcej spacji lub koniec napisu”.

W tej sytuacji użyłbym (?:\s+|$) (wewnątrz nieprzetworzonego łańcucha, jak wspomnieli inni). Część o numerze (?:) polega właśnie na oddzieleniu tego podwyrażenia, aby | operator dopasowuje poprawny fragment i nie więcej niż poprawny fragment.

+2

Mała poprawka: '\ s * $' dopasowuje __zero__ lub więcej spacji, po których następuje koniec ciągu znaków – stonesam92

+0

Dzięki, poprawiono. Zawsze używam + kiedy tylko to możliwe, więc wiem, jak popełniłem błąd __that__ :) – kampu

0

Spróbuj tego:

assert re.findall('@%s\\s*$' % uname, '@'+uname) 

Musisz uciec znak \ jeśli nie używać surowych sznurki.

To trochę zagmatwane, ale wynika z faktu, że \ jest metą dla zarówno interpretera pytonów, jak i modułu re.

+0

Przepraszam, ale drugi nie minął – whi

+0

@whi, drugi nie przeszedł, ponieważ '@abc aa' nie pasuje do wzorca białych spacji, po których następuje koniec ciągu znaków. Zobacz odpowiedź Kampu. – StoryTeller

0

Użyj raw strings.

assert re.findall(r'@%s\s*$' % uname, '@'+uname) 

przeciwnym razie zastosowanie \ jako szczególna postać w regularnych ciągów konfliktów z jego wykorzystania jako znak specjalny w wyrażeniach regularnych.

Ale to twierdzenie jest niemożliwe do porażki. Oczywiście łańcuch składający się wyłącznie z "@" i zawartości zmiennej uname będzie pasował do wyrażenia regularnego "@" plus uname oraz opcjonalnych (zawsze pustych) białych znaków, a następnie do końca ciągu znaków. To jest tautologia. Podejrzewam, że próbujesz sprawdzić coś innego?

Powiązane problemy