Wyobraź sobie, że próbujesz dopasować do wzorca „stackoverflow”.
Chcesz, co następuje:
this is stackoverflow and it rocks [MATCH]
stackoverflow is the best [MATCH]
i love stackoverflow [MATCH]
typostackoverflow rules [NO MATCH]
i love stackoverflowtypo [NO MATCH]
Wiem, jak przeanalizować przepełnienie stosu, jeśli ma spacje w obu witrynach, używając:
/\s(stackoverflow)\s/
To samo dotyczy sytuacji, gdy znajduje się na początku lub na końcu ciągu:
/^(stackoverflow)\s/
/\s(stackoverflow)$/
Ale jak określić „spację lub koniec ciągu” i „spację lub początek ciągu” za pomocą wyrażenia regularnego?
regex
preg-match
anonimowy-jeden
źródło
źródło
\b
jest asercją o zerowej szerokości; nigdy nie zużywa żadnych znaków. Nie ma potrzeby owijania go wokół.\b
jest to standardowe tylko ASCII , to znaczy brak obsługi Unicode. Jeśli chcesz dopasować słowa Unicode, nie masz innego wyjścia, jak tylko użyć tego zamiast tego: stackoverflow.com/a/6713327/1329367(?:^|\s)
(?<=\s|^)
z(?:(?<=\s)|(?<=^))
. W przeciwnym razie otrzymaszerror: look-behind requires fixed-width pattern
\b
Byłoby rozważyć inne postacie - takie jak „.
” jak słowo wyłączników, natomiast Pytający specjalnie powiedział „przestrzeń”. Rozwiązanie @ gordy wydaje się lepsze.(^|\s)
dopasowałoby spację lub początek ciągu i($|\s)
spację lub koniec łańcucha. Razem to:źródło
$1string$2
.$
i^
do klasy postaci, ale to pokazuje, że można je po prostu umieścić w zwykłej grupie wzorców.Oto, czego bym użył:
Innymi słowy, dopasuj „stackoverflow”, jeśli nie poprzedza go znak niebędący białą spacją i nie występuje po nim znak niebędący białą spacją.
Jest to ładniejsze (IMO) niż podejście „spacja lub kotwica” i nie zakłada, że łańcuch zaczyna się i kończy znakami słów, tak jak to
\b
robi podejście.źródło
\b
dopasowuje na granicach słowa (bez faktycznego dopasowywania żadnych znaków), więc poniższe czynności powinny zrobić, co chcesz:źródło
mystr = r'\bstack overflow\b'