Сопоставление с образцом с использованием регулярных выражений в строке символов - PullRequest
2 голосов
/ 28 октября 2011

У меня есть фрейм данных, который состоит из большого числа символьных строк, состоящих из 0, 1 и N. Вот несколько примеров:

a = "10000000011111111"
b = "11111111111111111"
c = "11111110000000NNN"
d = "00000000000000000"
e = "00000001111111111"
f = "11111000000000000"

Я ищу способ идентификации строк, которые состоят только из '0' и '1' без 'N' присутствует. Моя конечная цель - заменить в моем исходном фрейме данных «REC» в тех местах, где происходит такая ситуация. Подобно тому, что было сделано в этом вопросе .

Результат из моих приведенных выше данных будет:

a = "REC"
b = "11111111111111111"
c = "11111110000000NNN"
d = "00000000000000000"
e = "REC"
f = "REC"

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

markREC <- function(X) {
 gsub(X, pattern = "^(0)+.*(1)+$", 
      replacement = "REC?")}

Эта функция будет запущена для фрейма данных с lapply

Другая стратегия, которую я попробовал, основывалась на strsplit, но у меня возникли проблемы с тем, чтобы эта тоже работала. Я могу привести примеры, если люди хотят их видеть. Я полагаю, что это будет просто для некоторых экспертов по регулярным выражениям, но после многих часов попыток, я бы хотел помочь!

Ответы [ 4 ]

2 голосов
/ 28 октября 2011

Чтобы сопоставить строки, содержащие только 0 и 1 (а не строки, содержащие только 0 или 1), вы можете сделать:

grepl("^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", <string>)

Вот несколько примеров:

> grepl("^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", a)
[1] TRUE

> grepl("^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", b)
[1] FALSE

> grepl("^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", c)
[1] FALSE

Теперь подключите это к gsub:

> gsub(a, pattern="^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", replacement="REC")
[1] "REC"

> gsub(b, pattern="^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", replacement="REC")
[1] "11111111111111111"

> gsub(c, pattern="^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", replacement="REC")
[1] "11111110000000NNN"

> gsub(d, pattern="^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", replacement="REC")
[1] "00000000000000000"

> gsub(e, pattern="^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", replacement="REC")
[1] "REC"

> gsub(f, pattern="^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", replacement="REC")
[1] "REC"
2 голосов
/ 28 октября 2011

Эмм Я не уверен, что вы пытаетесь достичь с помощью своего регулярного выражения.

^(0)+.*(1)+$

Эффективно означает:

Начало строки, соответствует по крайней мере один 0, затем что-нибудь, затем следуетпо крайней мере на 1 и конец строки.Так вот: 032985472395871 соответствует:)

^(?=.*0)(?=.*1)[01]+$ будет соответствовать только тогда, когда полная строка состоит из 0 и 1, и есть хотя бы один 0 и хотя бы один 1.

// ^(?=.*0)(?=.*1)[01]+$
// 
// Assert position at the beginning of the string «^»
// Assert that the regex below can be matched, starting at this position (positive lookahead) «(?=.*0)»
//    Match any single character that is not a line break character «.*»
//       Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
//    Match the character “0” literally «0»
// Assert that the regex below can be matched, starting at this position (positive lookahead) «(?=.*1)»
//    Match any single character that is not a line break character «.*»
//       Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
//    Match the character “1” literally «1»
// Match a single character present in the list “01” «[01]+»
//    Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
// Assert position at the end of the string (or before the line break at the end of the string, if any) «$»
0 голосов
/ 28 октября 2011

Попробуйте это

^([01]*)[^01]+([01]*)$

Соответствует началу строки, за которой следуют 0 или более 0/1, за которыми следует не менее 1 символа, который не равен 0/1, а затем 0 или более 0/1 (за которым следует конец строки)

0 голосов
/ 28 октября 2011

Правильное регулярное выражение:

"[^N]*"

Я считаю.Это будет соответствовать строке любой длины, если она не содержит N.

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