我在这里遇到了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")
然而,这显然是错误的编码(重复)。任何人都有更优雅的解决方案吗?
答案 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
\b
字边界用于将john
与整个字匹配。
编辑:如果您在today
和go
之间有预定义的单词白名单,则无法匹配任何内容,您需要使用< 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
这会减少验证,但它更明显地表达了声明的意图:“约翰出现在句子中吗?”