获得括号中包含的短语计数并包含特定字符

时间:2016-11-16 17:46:43

标签: r regex string

必须有一个简单的答案,但我是regex的新手,找不到一个。

我有一个数据帧(df),文本字符串排列在长度为n(df $ text)的列向量中。本专栏中的每个文本都散布着括号内的短语。我可以使用以下方法识别这些短语:

regmatches(df$text, gregexpr("(?<=\\().*?(?=\\))", df$text, perl=T))[[1]]

上面的代码在括号之间返回所有文本。但是,我只对含有'v'的括号短语感兴趣。格式为'x v.y',其中x和y是括号之间的任意数量的字符(包括空格);例如,'(阿肯色州诉John Doe)'。匹配短语(法庭案件)总是这种格式:打开括号,以大写字母开头的单词,可能的空格和其他单词,v。,以大写字母开头的另一个单词,可能还有更多的空格和单词,紧密的括号

然后,我想创建一个新列,其中包含每行中x v.y短语的计数。

如果有一种方法可以单独为斜体表示的相同短语而不是用括号括起来:阿肯色州诉John Doe (但也许这应该作为一个单独的问题提出来)。

感谢您帮助新手!

2 个答案:

答案 0 :(得分:2)

如下所示更改正则表达式

#standardSQL
SELECT
  INTEGER(SUM(order2.demand_amount_usd)),
  order2.quarter_name,
  order2.year
FROM (
  SELECT
    order1.demand_amount_usd,
    order1.order_timestamp,
    d1.quarter_name,
    d1.year
  FROM
    [datamart.order_item_lifecycle] AS order1
  INNER JOIN EACH [datamart.date_dim] AS d
  ON
    (d.month) = STRING(MONTH((order.order_timestamp))) ) AS order2
INNER JOIN EACH [datamart.date_dim] AS d2
ON
  d2.year = INTEGER(YEAR(order2.order_timestamp))
WHERE
  order2.year = STRING(YEAR(CURRENT_DATE()))
GROUP BY
  order2.year,
  order2.quarter_name;

DEMO

答案 1 :(得分:2)

我相信我已经找到了你想要的东西,但是如果没有示例数据则很难说清楚。我已经制作了示例数据框以供使用。如果不是你想要的,请举个例子。

df <- data.frame(text = c("(Roe v. Wade) is not about boats", 
                          "(Dred Scott v. Sandford) and (Plessy v. Ferguson) have not stood the test of time", 
                          "I am trying to confuse you (this is not a court case)", 
                          "this one is also confusing (But with Capital Letters)", 
                          "this is confusing (With Capitols and v. d)"), 
                 stringsAsFactors = FALSE)

我认为你想要的正则表达式是:

cases <- regmatches(df$text, gregexpr("(?<=\\()([[:upper:]].*? v\\. [[:upper:]].*?)(?=\\))", 
                    df$text, perl=T))

然后,您可以获取案例数并将其添加到数据框中:

df$numCases <- vapply(cases, length, numeric(1))

至于斜体,我真的需要一个你的数据的例子。通常,当您在R中读取字符串时,不会存储这种格式,因此斜体实际上不再存在。