我想使用quanteda
和stringr
库运行正则表达式搜索,但我继续收到错误。我的目标是使用正则表达式\(VP\h+\(V\w*\h+\w*\)
匹配模式(VP (V.. ...)
。下面是一个MWE:
library(quanteda)
library(dplyr)
library(stringr)
text <- "(ROOT (S (NP (PRP It)) (VP (VBZ is) (RB not) (VP (VBN transmitted) (PP (IN from) (: :) (S (VP (VBG giving) (NP (NP (NP (NP (NML (NN blood)"
kwic_regex <- kwic(
# define text
text,
# define search pattern
"\(VP\h+\(V\w*\h+\w*\)",
window = 20,
# define valuetype
valuetype = "regex") %>%
# make it a data frame
as.data.frame()
这是错误消息:
Error: '\(' is an unrecognized escape in character string starting ""\("
我觉得这很令人困惑,因为正则表达式应该是正确的(参见。https://regex101.com/r/3hbZ0R/1)。我也试过转义转义(例如\\(
),但没有用。我真的很感激任何关于如何改进我的查询的想法。
2条答案
按热度按时间xqkwcwgp1#
R字符串似乎通过首先检查是否找到
允许转义的字符,它们可以替换结果控制代码。
由于普遍认为转义可以解析为单引号文本,
所有的转义都会在解析到传递给函数的
raw
regex字符串后解析。所以你的双引号字符串应该是
"\\(VP\\h+\\(V\\w*\\h+\\w*\\)"
,它被解析为\(VP\h+\(V\w*\h+\w*\)
,然后交给stringr函数。https://www.mycompiler.io/view/BjjkPXQUNpT
输出量
每种语言都强制执行不同的解析规则。
如果遇到未知的转义序列,有些会抛出错误
就像
\(
一样,其他人会简单地将转义剥离到这个(
,而不会告诉你。ojsjcaue2#
我发现了问题所在:显然,
kwic()
函数不再支持空格(参见kwic in quanteda (R) does not identify more than one word in regex pattern)。在运行搜索之前,我还使用了token()
函数,并将表达式 Package 在phrase()
中。下面是正确的代码:
输出: