如何制作一个带有选项的列表,其中一个是正则表达式中必须的,R?

时间:2016-12-08 10:53:41

标签: r regex quantifiers

我在这里遇到了R的正则表达式问题。我有三句话:

TRUE
TRUE
FALSE 

我想知道每个句子,约翰今天是否去海滩,不管其他两个人。因此,三个句子的结果应该是(按顺序)

print(grepl("today (john|jack|joe|and| )+go to the beach", s1))
print(grepl("today (john|jack|joe|and| )+go to the beach", s2))
print(grepl("today (john|jack|joe|and| )+go to the beach", s3))

我尝试用R中的grepl执行此操作。以下正则表达式为所有句子赋予TRUE:

print(grepl("today (jack|joe|and| )*john(jack|joe|and| )*go to the beach", s1))
print(grepl("today (jack|joe|and| )*john(jack|joe|and| )*go to the beach", s2))
print(grepl("today (jack|joe|and| )*john(jack|joe|and| )*go to the beach", s3))

当我将“john”(强制性词)夹在另外两个相同的量词之间时,它会有所帮助:

from bottle import route, run, template,

@route('/')
def home():
  return template("sandbox")


@route('/mystyle.css')
def giveCss():
  print("Giving css")
  return template("sandbox_css")

然而,这显然是错误的编码(重复)。任何人都有更优雅的解决方案吗?

2 个答案:

答案 0 :(得分:2)

您可以在不知道可能出现的地方使用.*

s <- c("today john jack and joe go to the beach", "today joe and john go to the beach", "today jack and joe go to the beach")
grepl("today .*\\bjohn\\b.* go to the beach", s)
## => [1]  TRUE  TRUE FALSE

请参阅online R demo

\b字边界用于将john与整个字匹配。

编辑:如果您在todaygo之间有预定义的单词白名单,则无法匹配任何内容,您需要使用< em>交替组与列出的所有替代组合,以及 - 如果你真的想缩短模式 - 在PCRE正则表达式中使用子程序调用:

> grepl("today ((?:jack|joe|and| )*)john(?1)\\bgo to the beach", s, perl=TRUE)
[1]  TRUE  TRUE FALSE

请参阅regex demo

此处,备选方案包含在量化的非捕获组中,整个组包含一个“技术”捕获组,可以使用(?1)递归子程序调用(1表示捕获组#1)。

答案 1 :(得分:0)

你需要验证句子的其余部分吗?因为否则我会选择简单:

sentences = c(s1, s2, s3)
grepl('\\bjohn\\b', sentences)
# [1]  TRUE  TRUE FALSE

这会减少验证,但它更明显地表达了声明的意图:“约翰出现在句子中吗?