R: Почему \ s {2} возвращает "\", "в регулярном выражении совпадения? И новая строка не совпадает с \\ n или \\ r и другими вариантами - PullRequest
0 голосов
/ 08 апреля 2020

У меня проблемы с (1) использованием динамической переменной c в шаблоне регулярных выражений и (2) соответствием "\" или новой строкой. Буду очень признателен за любую помощь!


Пример : В конечном итоге, насколько это возможно, я бы хотел сопоставить слово Administrator в текстовом файле ниже. Классификация данных текстового файла: character (изначально он был list и был приведен к character с использованием as.character(). Вот фрагмент текста:

[1] "c(\"Silk Road Forums\", \"\", \"*\", \"Welcome, Guest. Please login or register.\", \"[          ] [          ] [Forever] [Login]\", \"Login with username, password and session length\", \"[                    ]  [Search] \", \"\", \"  â\\200¢ Home\", \"  â\\200¢ Search\", \"  â\\200¢ Login\", \"  â\\200¢ Register\", \"\", \"\", \"  â\\200¢ Silk Road Forums »\", \"  â\\200¢ Profile of Dread Pirate Roberts »\", \"  â\\200¢ Summary\", \"\", \"  â\\200¢ Profile Info\", \"      â–¡ Summary\", \"      â–¡ Show Stats\", \"      â–¡ Show Posts...\", \"          â\\230† Messages\", \n\"          â\\230† Topics\", \"          â\\230† Attachments\", \"\", \"[profile_sm]Summary\", \"\", \"Dread Pirate Roberts Administrator\", \"\", \"[index]\", \"      â–¡ SMF | SMF © 2013, Simple Machines\"\n)"

Попытки / Проблемы

  1. Попытка сопоставить новую строку: В этом грязном тексте (см. Выше) я смог сопоставить [profile_sm]Summary\. Я пытался сопоставить то, что следует в этом тексте, используя:

    • \\n - не удалось
    • \\n\\r - не удалось
    • \\n|\\r - не удалось
    • \\r\\n - не удалось
    • \\r|\\n - не удалось

    Кажется, что после этой строки нет новой строки, поэтому я попытался сопоставить литерал "", "(внутри кавычек: кавычка и запятая), который следует за символами в этом тексте. Поэтому я также попробовал эти два, и оба они потерпели неудачу: \\ и \\"\".

  2. Пытался использовать переменную: Я пытался использовать переменную X, которая включает Dread Pirate Roberts из предыдущего совпадения с регулярным выражением, превращенным в вектор. Я пытался просто вставить X в шаблон регулярного выражения, но это очевидно не сработало. Можно ли создать шаблон, используя X? Например: сопоставьте одно из значений, найденных в x.


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


Редактировать заметку : увидел, что у людей возникли проблемы с пониманием этого поста, поэтому я отредактировал его, чтобы сделать его более разборчивым. Спасибо и приветствия @Wiktor Stribiżew за прочтение оригинального сообщения, несмотря на сложную формулировку и ответ! :)

1 Ответ

1 голос
/ 09 апреля 2020

Ваш текст содержит только две новые строки, вы можете легко проверить его, используя cat(text), и есть три строки:

c("Silk Road Forums", "", "*", "Welcome, Guest. Please login or register.", "[ ] [ ] [Forever] [Login]", "Login with username, password and session length", "[ ] [Search] ", "", " � Home", " � Search", " � Login", " � Register", "", "", " � Silk Road Forums »", " � Profile of Dread Pirate Roberts »", " � Summary", "", " � Profile Info", " □ Summary", " □ Show Stats", " □ Show Posts...", " � Messages", 
" � Topics", " � Attachments", "", "[profile_sm]Summary", "", "Dread Pirate Roberts Administrator", "", "[index]", " □ SMF | SMF © 2013, Simple Machines"
)

Итак, как вы видите, после [profile_sm]Summary нет новой строки. Заметьте, что для совпадения [ в шаблоне регулярных выражений вам необходимо его избежать. Есть пробел, " и запятые. Эти символы можно сопоставить, используя шаблон [,"\s]+. Переменная X будет содержать Dread Pirate Roberts, поэтому для извлечения Administrator вы можете использовать

\[profile_sm]Summary[",\s]*Dread Pirate Roberts\s+\K[^"]+

См. Демонстрационную версию regex .

Подробности

  • \[profile_sm]Summary - [profile_sm]Summary string
  • [",\s]* - 0+ ", , или пробельные символы
  • Dread Pirate Roberts - буквенная строка
  • \s+ - 1+ пробелов
  • \K - оператор сброса совпадений, который отбрасывает сопоставленный текст в буфере памяти совпадений
  • [^"]+ - 1+ символов кроме ". Если вам нужно сопоставить только буквы, цифры или _, вы можете использовать \w+ вместо этого шаблона (с \\ в строковом литерале).

R демо:

text <- "c(\"Silk Road Forums\", \"\", \"*\", \"Welcome, Guest. Please login or register.\", \"[ ] [ ] [Forever] [Login]\", \"Login with username, password and session length\", \"[ ] [Search] \", \"\", \" â\200¢ Home\", \" â\200¢ Search\", \" â\200¢ Login\", \" â\200¢ Register\", \"\", \"\", \" â\200¢ Silk Road Forums »\", \" â\200¢ Profile of Dread Pirate Roberts »\", \" â\200¢ Summary\", \"\", \" â\200¢ Profile Info\", \" â–¡ Summary\", \" â–¡ Show Stats\", \" â–¡ Show Posts...\", \" â\230† Messages\", \n\" â\230† Topics\", \" â\230† Attachments\", \"\", \"[profile_sm]Summary\", \"\", \"Dread Pirate Roberts Administrator\", \"\", \"[index]\", \" â–¡ SMF | SMF © 2013, Simple Machines\"\n)"
X <- "Dread Pirate Roberts"
regex <- paste0('\\[profile_sm]Summary[",\\s]*',X,'\\s+\\K[^"]+')
regmatches(text, regexpr(regex, text, perl=TRUE))
## => [1] "Administrator"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...