Извлекать точные совпадения из массива - PullRequest
1 голос
/ 06 апреля 2019

Предположим, у меня есть текст, и я хочу извлечь точные совпадения.Как я могу сделать это эффективно:

test_text <- c("[]", "[1234]", "[1234a]", "[v1256a] ghjk kjh", 
               "[othername1256b] kjhgfd hgj",
               "[v1256] ghjk kjh", "[v1256] kjhgfd hgj",
               " text here [name1991] and here",
               "[name1990] this is an explanation",
               "[name1991] this is another explanation",
               "[mäölk1234]")
expected <- c("[v1256a]", "[othername1256b]", "[v1256]", "[v1256]", "[name1991]",
              "[name1990]", "[name1991]", "[mäölk1234]")

# This works:
regmatches(text, regexpr("\\[.*[0-9]{4}.*\\]", text))

Но я думаю, что-то вроде "\\[.*[0-9]{4}(?[a-z])]\\]" будет лучше, но выдает ошибку

Ошибка в регулярном выражении ("\ [. [0-9] {4} (? [Az])] \] ", текст): недопустимое регулярное выражение '[. [0-9] {4} (? [Az])]]'причина 'Недопустимое регулярное выражение'

Только одна буква должна следовать за годом, но не может быть , см. пример.Извините, я редко использую регулярное выражение ...

1 Ответ

1 голос
/ 06 апреля 2019

Обновлено решение вопроса

Кажется, вы хотите извлечь все вхождения букв 1+, за которыми следуют 4 цифры, а затем необязательная буква в квадратных скобках.

Используйте

test_text <- c("[]", "[1234]", "[1234a]", "[v1256a] ghjk kjh", 
           "[othername1256b] kjhgfd hgj",
           "[v1256] ghjk kjh", "[v1256] kjhgfd hgj",
           " text here [name1991] and here",
           "[name1990] this is an explanation",
           "[name1991] this is another explanation",
           "[mäölk1234]")

regmatches(test_text, regexpr("\\[\\p{L}+[0-9]{4}\\p{L}?]", test_text, perl=TRUE))
# => c("[v1256a]", "[othername1256b]", "[v1256]", "[v1256]", "[name1991]",
#      "[name1990]", "[name1991]", "[mäölk1234]")

См. R демо онлайн. ПРИМЕЧАНИЕ что вам нужно использовать регулярное выражение PCRE, чтобы это работало, perl=TRUE имеет решающее значение здесь.

Детали

  • \[ - [ char
  • \p{L}+ - 1+ любые буквы Unicode
  • [0-9]{4} - четыре цифры ASCII
  • \\p{L}? - необязательная любая буква Unicode
  • ] - ] char.

Оригинальный ответ

Используйте

regmatches(test_text, regexpr("\\[[^][]*[0-9]{4}[[:alpha:]]?]", test_text))

Или

regmatches(test_text, regexpr("\\[[^][]*[0-9]{4}[a-zA-Z]?]", test_text))

См. Демоверсию regex и график Regulex :

enter image description here

Детали

  • \[ - [ char
  • [^][]* - 0 или более символов, отличных от [ и ] ( СОВЕТ : если вы ожидаете только буквы здесь, замените на [[:alpha:]]* или [a-zA-Z]*)
  • [0-9]{4} - четыре цифры
  • [[:alpha:]]? - дополнительная буква (или [a-zA-Z]? будет соответствовать любой дополнительной букве ASCII)
  • ] - ] char

R тест:

regmatches(test_text, regexpr("\\[[^][]*[0-9]{4}[[:alpha:]]?]", test_text))
## => [1] "[v1256a]"         "[othername1256b]" "[v1256]"          "[v1256]"          "[name1991]"       "[name1990]"       "[name1991]"      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...