Представьте, что вы пытаетесь сопоставить шаблон "stackoverflow".
Вам нужно следующее:
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]
Я знаю, как разобрать stackoverflow, если на обоих сайтах есть пробелы, используя:
/\s(stackoverflow)\s/
То же самое, если оно находится в начале или в конце строки:
/^(stackoverflow)\s/
/\s(stackoverflow)$/
Но как указать «пробел или конец строки» и «пробел или начало строки» с помощью регулярного выражения?
regex
preg-match
анонимные один
источник
источник
\b
- утверждение нулевой ширины; он никогда не потребляет никаких символов. Нет необходимости оборачивать это взглядом.\b
является стандартным ASCII только , что не сказать, никакой поддержки юникода. Если вам нужно сопоставить слова Unicode, у вас нет другого выбора, кроме как использовать это вместо: stackoverflow.com/a/6713327/1329367(?:^|\s)
(?<=\s|^)
на(?:(?<=\s)|(?<=^))
. В противном случае вы получитеerror: look-behind requires fixed-width pattern
\b
Рассмотрят другие символы - такие , как «.
» как слово выключатели, в то время как Аскер конкретно сказал «пространство». Решение @gordy кажется лучше.(^|\s)
будет соответствовать пробелу или началу строки и($|\s)
пробелу или концу строки. Вместе это:источник
$1string$2
.$
и^
в класс символов, но это показывает, что их можно просто поместить в обычную группу шаблонов.Вот что я бы использовал:
Другими словами, соответствует «stackoverflow», если ему не предшествует непробельный символ и за ним не следует непробельный символ.
Это более аккуратно (ИМО), чем подход «пробел или привязка», и он не предполагает, что строка начинается и заканчивается символами слова, как в этом
\b
подходе.источник
\b
совпадает с границами слова (без фактического совпадения каких-либо символов), поэтому следующее должно делать то, что вы хотите:источник
mystr = r'\bstack overflow\b'