Regex для извлечения чисел и завершающей буквы или пробела - PullRequest
7 голосов
/ 18 марта 2019

В настоящее время я пытаюсь извлечь данные из строк, которые всегда имеют один и тот же формат (извлечено из социальных сайтов без поддержки API)

пример строк

53.2k Followers, 11 Following, 1,396 Posts
5m Followers, 83 Following, 1.1m Posts

В настоящее время я использую следующее выражение регулярного выражения: "[0-9] {1,5} ([,]. [0-9] {1,4})?" чтобы получить числовые разделы, сохраняя разделитель запятой и точки.

Это дает результаты как

53.2, 11, 1,396 
5, 83, 1.1

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

53.2k, 11 , 1,396
5m, 83 , 1.1m

Любая помощь очень ценится

R код для воспроизведения

  library(stringr)

  string1 <- ("536.2k Followers, 83 Following, 1,396 Posts")
  string2 <- ("5m Followers, 83 Following, 1.1m Posts")

  info <- str_extract_all(string1,"[0-9]{1,5}([,.][0-9]{1,4})?")
  info2 <- str_extract_all(string2,"[0-9]{1,5}([,.][0-9]{1,4})?")

  info 
  info2 

Ответы [ 5 ]

4 голосов
/ 18 марта 2019

Я бы предложил следующий шаблон регулярных выражений:

[0-9]{1,3}(?:,[0-9]{3})*(?:\\.[0-9]+)?[A-Za-z]*

Этот шаблон генерирует ожидаемые результаты.Вот объяснение:

[0-9]{1,3}      match 1 to 3 initial digits
(?:,[0-9]{3})*  followed by zero or more optional thousands groups
(?:\\.[0-9]+)?  followed by an optional decimal component
[A-Za-z]*       followed by an optional text unit

Я склонен склоняться к базовым решениям R всякий раз, когда это возможно, и вот один, использующий gregexpr и regmatches:

txt <- "53.2k Followers, 11 Following, 1,396 Posts"
m <- gregexpr("[0-9]{1,3}(?:,[0-9]{3})*(?:\\.[0-9]+)?[A-Za-z]*", txt)
regmatches(txt, m)

[[1]]
[1] "53.2k"   "11"   "1,396"
0 голосов
/ 18 марта 2019

Если вы также хотите получить символ после числовой секции, даже если это пробел, вы можете использовать свой шаблон и дополнительный класс символов [mk ]?, включая пробел:

[0-9]{1,5}(?:[,.][0-9]{1,4})?[mk ]?

Regex demo | R демо

Вы можете расширить диапазон символов в классе символов, чтобы он соответствовал [a-zA-Z ]?. Если вы хотите использовать квантификатор для соответствия 1+ разу символа ИЛИ одному пробелу, вы можете использовать чередование:

[0-9]{1,5}(?:[,.][0-9]{1,4})?(?:[a-zA-Z]+| )?
0 голосов
/ 18 марта 2019

Другой вариант stringr:

new_s<-str_remove_all(unlist(str_extract_all(string2,"\\d{1,}.*\\w")),"[A-Za-z]{2,}")
strsplit(new_s," , ")

    #[[1]]
    #[1] "5m"    "83"    "1.1m "

Оригинал

str_remove_all(unlist(str_extract_all(string2,"\\d{1,}\\W\\w+")),"[A-Za-z]{2,}")
#[1] "83 "  "1.1m"
str_remove_all(unlist(str_extract_all(string1,"\\d{1,}\\W\\w+")),"[A-Za-z]{2,}")
#[1] "536.2k" "83 "    "1,396" 
0 голосов
/ 18 марта 2019

( Обновлено мой предыдущий пост, в котором выбраны посторонние запятые / пробел)
Это работает, чтобы удовлетворить требование OP для извлечения trailing letter or white space after the numeric sections (без посторонних запятых и белых_пространств моей предыдущей версии):

(?: [\ D] + [.,]? (? = \ D *) [\ d] * [км]?)

предыдущая версия:\ b (?: [\ d.,] + [км \ с]?)

Explanation:  
- (?:          indicates non-capturing group
- [\d]+        matches 1 or more digits
- [.,]?(?=\d*) matches 0 or 1 decimal_point or comma that is immediately followed ("Positive Lookahead") by 1 or more digits
- [\d]*        matches 0 or more digits
- [km\s]?      matches 0 or 1 of characters within []
53.2k Followers, 11 Following, 1,396 Posts     
5m Followers, 83 Following, 1.1m Posts  
# 53.2k; 11 ; 1,396
# 5m; 83 ; 1.1m  

обратите внимание на пробелы, сопоставленные после 11 и 83, как это предусмотрено в OP.

0 голосов
/ 18 марта 2019

Мы можем добавить необязательный символьный аргумент в регулярное выражение

stringr::str_extract_all(string1,"[0-9]{1,5}([,.][0-9]{1,4})?[A-Za-z]?")[[1]]
#[1] "536.2k" "83"     "1,396" 
stringr::str_extract_all(string2,"[0-9]{1,5}([,.][0-9]{1,4})?[A-Za-z]?")[[1]]
#[1] "5m"   "83"   "1.1m"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...