2015-04-17 2 views
2

Быстрый вопрос: может кто-нибудь сказать мне, почемуНеожиданное поведение с использованием отрицательных lookaheads в R

grepl('p(?!q)', 'pq', perl = TRUE) 

является FALSE

но

grepl('p(?!p)', 'pp', perl = TRUE) 

является TRUE?

Не следует ли применять такую ​​же логику? Как использовать отрицательный lookahead для соответствия со строкой, содержащей «p», за которой НЕ следует другой «p»?

+0

'р (? ! p) ', является регулярным выражением для соответствия' p', за которым не следует другое 'p' –

ответ

3

Нет, потому что с (?!p) он по-прежнему будет соответствовать из-за конца строки. Чтобы исправить взгляд, вам нужно утверждать, что не следует ни «p», ни позиции в конце строки.

grepl('p(?!p|$)', 'pp', perl = TRUE) 
# [1] FALSE 

Lookahead не действительно нужен здесь либо, вы можете использовать отрицание класса символов:

grepl('p[^p]', c('pp', 'ppp', 'pq')) 
# [1] FALSE FALSE TRUE 

же логики не позволяя "Q", чтобы следовать:

grepl('p[^q]', c('pp', 'ppp', 'pq')) 
# [1] TRUE TRUE FALSE 
+0

Очистить пояснения с кодом для включенного решения. Благодаря! – Aaron

5
grepl('p(?!q)', 'pq', perl = TRUE) 

здесь есть один p, поэтому он проверяет, что однократное p только. Проверки для этого единственного p не следует q. Но это терпит неудачу, так как p следует за q. Поскольку он не находит соответствие, он возвращает FALSE

grepl('p(?!p)', 'pp', perl = TRUE) 

Здесь он проверяет первый p. Он терпит неудачу, так как за первым p следует еще p. Но когда он проверяет второй p, условие становится истинным, так как после второго p не следует p. Поскольку он находит по крайней мере одно совпадение, это возвращает TRUE.

+0

Спасибо за четкое объяснение, Avinash. Я закончил тем, что выбрал hwnd только потому, что он предоставил код, который исправил проблему, с которой я столкнулся. Оба действительно полезных ответа. – Aaron

+0

они оба были отличными ответами, еще раз спасибо за ваше время. Я бы согласился, если бы мог. hwnd ответил на первый вопрос (хотя и с меньшими деталями, чем вы), а также предоставил ответ на вопрос «Как использовать отрицательный результат для соответствия со строкой, содержащей« p », за которой не следует другая« p »?» – Aaron

Смежные вопросы