Проблема с соответствием пунктуации с использованием регулярных выражений в R - PullRequest
1 голос
/ 17 мая 2019

Я работаю над преобразованием данных в формат XML.Одно из ограничений XML заключается в том, что:

Имена тегов не могут содержать символы! "# $% & '() * +, /; <=>? @ [] ^` {|} ~,ни пробел, и не может начинаться с "-", "." или цифры.

Я пытаюсь перехватить эти ошибки перед созданием тегов, и у меня возникают проблемы с использованием регулярных выражений для сопоставления чего-либо, содержащеголюбой из этих символов.

Я хотел бы иметь возможность использовать '[: punct:]', но так как допускается несколько знаков препинания, я не могу.

Регулярное выражение, которое я пробовал:

'[!"#$%&\'()*+,/;<=>?@[\\]^`\\{|\\}~ ]'

R код:

practice <- c("T[K","T!K","T\"K","T#K","T$K","T%K","T&K","T'K","T(K",  "T)K","T*K","T+K","T,K","T/K","T;K","T<K","T=K","T>K","T?K","T@K",  "T[K","T\\K","T]K","T^K","T`K","T{K","T|K","T}K","T~K","T]K")

grepl(pattern = '[!"#$%&\'()*+,/;<=>?@[\\]^`\\{|\\}~]', practice)

Я ожидал, что все результаты будут ИСТИНА.

Фактические результаты:

[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[18] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

Япредполагая, что я испортил синтаксис обратной косой черты или понимание []. Тем не менее, я занимался исследованиями и все еще не могу понять, что не так. Любая помощь будет большой. Спасибо

1 Ответ

1 голос
/ 17 мая 2019

Я думаю, вам нужно больше побегов.Здесь я избежал каждого специального символа регулярного выражения и переупорядочил шаблон так, чтобы они были в том же порядке, что и в practice.Обратите внимание, что у вас ] появляется дважды в practice;Я удалил его и добавил примеры с _ и ., так как вы сказали, что они разрешены, и я могу показать, что они не совпадают правильно.

Помните, что \ - это escape в R-строках, а затемтакже является escape в регулярных выражениях, поэтому вам нужно \\ экранировать специальные символы в регулярном выражении.Другими словами, предоставленная строка \\$ рассматривается как шаблон \$, что означает литерал $ вместо конца строки,Это также означает, что вам нужно \\\\ для литерала \ ...

practice <- c("T.K","T_K","T[K","T!K","T\"K","T#K","T$K","T%K","T&K","T'K","T(K",  "T)K","T*K","T+K","T,K","T/K","T;K","T<K","T=K","T>K","T?K","T@K","T[K","T\\K","T]K","T^K","T`K","T{K","T|K","T}K","T~K")

stringr::str_detect(practice, "[\\[\\!\"#\\$%&'\\(\\)\\*\\+,/;<=>\\?@\\[\\\\\\]\\^`\\{\\|\\}~]")
#>  [1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#> [12]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#> [23]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
grepl("[\\[\\!\"#\\$%&'\\(\\)\\*\\+,/;<=>\\?@\\[\\\\\\]\\^`\\{\\|\\}~]", practice, perl = TRUE)
#>  [1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#> [12]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#> [23]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

Создано в 2019-05-17 с помощью пакета Представить (v0.2,1)

...