Jak se zbavit azbuky, čínštiny apod.

Do dat se občas dostane nechtěná ruština, čínština, řečtina, nebo jiný jazyk psaný nelatinkovým písmem. Tohle je rychlý návod, jak se takových textů pomocí regulárních výrazů zbavit, nebo je naopak najít.

Author
Affiliation
Marek Prokop
Published

May 1, 2022

Rychlý příklad

Mám tahle data:

library(tidyverse)

df <- tibble(
  text = c(
    "Praha - Střešovice",
    "Prague - Stresovice",
    "布拉格 - Střešovice",
    "Прага - Střešovice",
    "Πράγα - Střešovice"
  ), 
  jazyk = c("česky", "anglicky", "čínsky", "rusky", "řecky")
)

df
text jazyk
Praha - Střešovice česky
Prague - Stresovice anglicky
布拉格 - Střešovice čínsky
Прага - Střešovice rusky
Πράγα - Střešovice řecky

Chci odstranit texty v azbuce

df |> 
  filter(!str_detect(text, "[\\p{Cyrillic}]"))
text jazyk
Praha - Střešovice česky
Prague - Stresovice anglicky
布拉格 - Střešovice čínsky
Πράγα - Střešovice řecky

Chci odstranit texty v čínštině

df |> 
  filter(!str_detect(text, "[\\p{Han}]"))
text jazyk
Praha - Střešovice česky
Prague - Stresovice anglicky
Прага - Střešovice rusky
Πράγα - Střešovice řecky

Chci odstranit texty v řečtině

df |> 
  filter(!str_detect(text, "[\\p{Greek}]"))
text jazyk
Praha - Střešovice česky
Prague - Stresovice anglicky
布拉格 - Střešovice čínsky
Прага - Střešovice rusky

Chci odstranit texty v čekmoli kromě latinky

To už je těžší. V předešlých případech jsem odstranil texty, které obsahovaly alespoň jeden znak z daného Unicode rozsahu, ale zde musím odstranit texty, které obsahují jenom znaky z daného rozsahu. Musím tedy zkombinovat tři část:

  • {Latin} – latinkové znaky
  • {Punct} – interpunkce
  • \x20 – mezera (může být napsaná i normálně, ale byla by blbě vidět)
df |> 
  filter(str_detect(text, "^[\x20\\p{Punct}\\p{Latin}]+$"))
text jazyk
Praha - Střešovice česky
Prague - Stresovice anglicky

Chci najít…

Samozřejmě to jde použít i pro hledání textů s určitými znaky.

Všechny v azbuce:

df |> 
  filter(str_detect(text, "[\\p{Cyrillic}]"))
text jazyk
Прага - Střešovice rusky

Všechny nelatinkové:

df |> 
  filter(!str_detect(text, "^[\x20\\p{Punct}\\p{Latin}]+$"))
text jazyk
布拉格 - Střešovice čínsky
Прага - Střešovice rusky
Πράγα - Střešovice řecky

V případě potřeby něčeho speciálního poslouží podrobný přehled Unicode v regulárních výrazech.