Как удалить части текстового вектора, используя gsub и регулярные выражения - PullRequest
1 голос
/ 28 июня 2019

У меня есть список, в котором каждый элемент содержит вектор текстовых данных.По сути, я хотел бы, чтобы код для удаления текста, который следует после регулярного выражения: второе «.»в соответствующем векторе.

Я считаю, что функция gsub - хороший способ сделать это, если она используется в связи с регулярными выражениями.Я попытался сформулировать шаблон для обнаружения с помощью регулярного выражения (см. Ниже).

Данные:

v<-c("M. le président. La parole est à M. Emile Vernaudon.",
       "M.Gabriel Xaaperei. Monsieur le ministre",
       "M. Raymond Fornir, rapporteur. La commission") 

Код:

Subbed<-gsub("[^((?<=^M. *))]", "X", v)

Код возвращает следующее:

[1] "M. XX XXXXXXXXX. XX XXXXXX XXX. M. XXXXX XXXXXXXXX."
[2] "M. XXXXXXX XXXXXXXXX. MXXXXXXX XX XXXXXXXXX XXX"    
[3] "M. XXXXXXX XXXXXX XXXXXXXXXX. XX XXXXXXXXXX" 

Мало того, что код учитывает все «М.», но во втором ряду также есть «М», хотя это не так.сопровождаемый "."Я догадываюсь, что в gsub регулярные выражения, кажется, работают по-другому - "М."в моем коде R может читаться как «M |».Кроме того, ^ после Lookaround, кажется, не работает как якорь, а просто как дополнительный знак пунктуации.

Желаемый результат следующий:

[1] "M. le président."
[2] "M. Gabriel Xaaperei."
[3] "M. Raymond Fornir, rapporteur."

Любая помощь, высоко ценимая.

Ответы [ 3 ]

3 голосов
/ 28 июня 2019

1) sub Соответствует началу строки (^) и затем захватывает M..Следующее совпадение пробелов, если оно есть, и затем захватывание всего до следующей точкиНаконец, сопоставьте все остальное.Замените это первым захватом (\ 1), пробелом и вторым захватом (\ 2).

Обратите внимание, что мы используем sub вместо gsub, поскольку для каждого компонента существует только одно общее совпадение.Кроме того, после М. ставится пробел, даже если у него его еще нет.

sub("^(M\\.) *([^.]+\\.).*", "\\1 \\2", v)

, что дает:

[1] "M. le président."               "M. Gabriel Xaaperei."          
[3] "M. Raymond Fornir, rapporteur."

2) read.table Это решение не использует регулярные выражения.Мы читаем в v, используя поля, разделенные точками, а затем собираем их вместе, используя sprintf.

with(read.table(text = v, sep = ".", fill = TRUE, strip.white = TRUE), 
  sprintf("%s. %s.", V1, V2))

, давая:

[1] "M. le président."               "M. Gabriel Xaaperei."          
[3] "M. Raymond Fornir, rapporteur."

3) paste / trimws /sub Использует несколько функций и только одно регулярное выражение, что относительно просто.Мы берем все, начиная с 3-го символа и далее, заменяя первую точку и все, что после нее, на точку, обрезаем пробел в случае, если она есть, и вставляем M. в начало.

paste("M.", trimws(sub("\\..*", ".", substring(v, 3))))

, давая:

[1] "M. le président."               "M. Gabriel Xaaperei."          
[3] "M. Raymond Fornir, rapporteur."

Добавить

2 голосов
/ 28 июня 2019
    gsub("^([^.]*.[^.]*).*", "\\1.", v)

[1] "M. le président."               "M.Gabriel Xaaperei."           
[3] "M. Raymond Fornir, rapporteur."
1 голос
/ 28 июня 2019

Вы поместили свое регулярное выражение в квадратные скобки, которые R интерпретирует как группу, и затем действительно обрабатывает все в этой группе как "ИЛИ". Вы также предшествовали этому с помощью ^, который заставляет R воспринимать его как «НЕ», так что он в основном ищет все, кроме символов в вашем поисковом запросе. Кроме того, вы не избежали своих менструаций. Вот регулярное выражение, как и должно быть:

gsub("^(M\\..*?\\.).*","\\1",v)
[1] "M. le président."               "M.Gabriel Xaaperei."           
[3] "M. Raymond Fornir, rapporteur."

Это ищет M. (период сбежал), за которым следует что-либо (без выхода) в течение неопределенного числа раз (*), за которым следует второй (сбежавший) период (? - это чтобы удостовериться, что это не так уж плохо, так что это не последний период, а только следующий).

Если они все вернут туда (\\1), а остальные отбрасывают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...