R - регулярное выражение: метасимвол W не работает в квадратных скобках

Возьмем следующую строку:

x <- " hello world"

Я хотел бы извлечь первое слово. Для этого я использую следующее регулярное выражение ^\\W*([a-zA-Z]+).* с обратной ссылкой на первую группу.

> gsub("^\\W*([a-zA-Z]+).*", "\\1", x)
[1] "hello"

Он работает так, как ожидалось.

Теперь давайте добавим цифру и подчеркнем нашу строку:

x <- " 0_hello world"

Я заменяю \\W на [\\W_0-9], чтобы соответствовать новым символам.

> gsub("^[\\W_0-9]*([a-zA-Z]+).*", "\\1", x)
[1] " 0_hello world"

Теперь он не работает, и я не понимаю, почему. Кажется, проблема возникает при помещении \\W в [], но я не уверен, почему. Однако регулярное выражение работает на онлайн-тестере регулярных выражений с использованием PCRE.

Что я делаю не так?


person Junitar    schedule 03.03.2019    source источник
comment
Попробуйте с sub("^[ 0-9]*([a-zA-Z]+).*", "\\1", x,)   -  person akrun    schedule 03.03.2019
comment
@akrun, причина, по которой я использовал метасимвол W вместо простого пробела, заключается в том, что я имею дело со многими строками, начинающимися с различных символов, включая знаки препинания, пробел, цифры и знаки подчеркивания.   -  person Junitar    schedule 03.03.2019
comment
используйте perl = TRUE т.е. sub("^[\\W_0-9]*([a-zA-Z]+).*", "\\1", x, perl = TRUE) Здесь я использую sub, потому что мы сопоставляем это только один раз   -  person akrun    schedule 03.03.2019
comment
@mt1022 perl=TRUE устранил проблему. Можете ли вы сделать это как ответ, чтобы я мог принять его? Спасибо.   -  person Junitar    schedule 03.03.2019
comment
Добавление perl=TRUE не является полным решением. Вам нужно добавить (?s) перед регулярным выражением, поскольку в TRE . соответствует любому символу, а в PCRE он соответствует любому символу, кроме символов разрыва строки.   -  person Wiktor Stribiżew    schedule 03.03.2019
comment
@Wiktor Stribiżew Спасибо за дополнительную информацию.   -  person Junitar    schedule 03.03.2019


Ответы (1)


Быстрое решение — использовать Perl-подобные регулярные выражения, добавив дополнительный аргумент perl = TRUE.

По умолчанию grep используют расширенные регулярные выражения (см. ?regex), где классы символов определены в формате [:xxx:]. Однако я не смог найти класс символов, точно соответствующий \W.

person mt1022    schedule 03.03.2019