Простое решение:
Вам нужно только немного адаптировать свое регулярное выражение, чтобы соответствовать не только пробелу, но и всему, что не является буквой или числом:
str_detect(classes, "STA[^A-z0-9]190X")
[1] TRUE
Объяснение :
Это самая странная вещь:
match_position <- gregexpr("STA[^ ]*190X", classes)[[1]][1]
substr(classes, match_position - 10, match_position + 17)
Приведенный выше код возвращает совпадение чего-то, что выглядит как строка 'STA 190X', но не .
"r.</p><h2>STA 190X—Seminar ("
Этого не может быть, потому что между STA и 190X не может быть пробела. Если бы был пробел, gregexpr
не поймал бы его (STA[^ ]*190X
соответствует всему, что не имеет пробел (ы) между STA и 190X)
Редактировать:
Сгущение сюжета:
grepl("STA[^[:punct:]]*190X", classes)
Возвращает нет соответствия, что, я думаю, означает, что загадочный персонаж является одним из:
[: punct:]
Знаки пунктуации:! "# $% & '() * +, -. /:; <=>? @ [\] ^ _` {|} ~.