john
john

Reputation: 1036

Finding alphanumeric in R

I have character vector in russian language. See the sample vector below -

x = "nНозологические единицы  \r\n В20 Болезнь, вызванная вирусом иммунодефицита человека [ВИЧ], проявляющаяся в виде  \r\nинфекционных и паразитарных болезней \r\n В21 Болезнь, вызванная вирусом иммунодефицита человека [ВИЧ], проявляющаяся в виде \r\nзлокачественных новообразований \r\n В22 Болезнь, вызванная вирусом иммунодефицита человека [ВИЧ], проявляющаяся в виде \r\nдругих уточненных болезней \r\n В78.1 Болезнь, вызванная вирусом иммунодефицита человека [ВИЧ], проявляющаяся в виде \r\nдругих состояний \r\n В24 Болезнь, вызванная вирусом иммунодефицита человека [ВИЧ], неуточненная \r\n Z21 Бессимптомный инфекционный статус, вызванный вирусом иммунодефицита человека"

I want to extract these values - B20, B21, B22, B78.1, B24, Z21. I am using the code below -

gsub("[^0-9A-Za-z///' ]", "", x)

But it is returning the wrong result.

[1] "n    20     21     22   781      24         Z21       "

Upvotes: 1

Views: 46

Answers (2)

cderv
cderv

Reputation: 6542

Using stringr, you can use str_extract_all with this regex

x = "nНозологические единицы  \r\n В20 Болезнь, вызванная вирусом иммунодефицита человека [ВИЧ], проявляющаяся в виде  \r\nинфекционных и паразитарных болезней \r\n В21 Болезнь, вызванная вирусом иммунодефицита человека [ВИЧ], проявляющаяся в виде \r\nзлокачественных новообразований \r\n В22 Болезнь, вызванная вирусом иммунодефицита человека [ВИЧ], проявляющаяся в виде \r\nдругих уточненных болезней \r\n В78.1 Болезнь, вызванная вирусом иммунодефицита человека [ВИЧ], проявляющаяся в виде \r\nдругих состояний \r\n В24 Болезнь, вызванная вирусом иммунодефицита человека [ВИЧ], неуточненная \r\n Z21 Бессимптомный инфекционный статус, вызванный вирусом иммунодефицита человека"

stringr::str_extract_all(x, "[:alpha:][[:digit:]\\.]+")
#> [[1]]
#> [1] "В20"   "В21"   "В22"   "В78.1" "В24"   "Z21"  

About the regex:

  • [:alpha:] means any letter character
  • [[:digit:]\\.] followed by any numeric or . character
  • + the previous one or more time

Change the regex when what you want to extract changes

Upvotes: 1

lmo
lmo

Reputation: 38510

Here is a base R method using gregexpr to return positions and regmatches to extract matching portions of text.

unlist(regmatches(x, gregexpr("[ВZ][27][[:digit:].]+", x)))
[1] "В20"   "В21"   "В22"   "В78.1" "В24"   "Z21"  

Note that the "B" is not the standard ascii "B". I copied and pasted one from the vector to get this to work. You can see this using utfToInt:

ascii "B":

utf8ToInt("B")
[1] 66

The "B" in x

utf8ToInt("В")
[1] 1042

Upvotes: 1

Related Questions