【问题标题】:Filter dataset based on regexp for end of strings根据字符串结尾的正则表达式过滤数据集
【发布时间】:2021-06-06 14:07:56
【问题描述】:

我正在使用 REGEXP 过滤一个包含 10 行的数据集,如下所示:

ID     Product
1      "VENLAFAXINE HCL CAP ER 24HR 37.5 MG (BASE EQUIVALENT)"
2      "MINOXIDIL POWDER"
3      "MENTHOL LOZENGE 10 MG"
4      "ZINC CHLORIDE GRANULES"
5      "CLOPIDOGREL BISULFATE TAB 75 MG (BASE EQUIV)"
6      "METHYLPREDNISOLONE TAB THERAPY PACK 4 MG (21)"
7      "DEXAMETHASONE TAB THERAPY PACK 1.5 MG (7)"
8      "METHYLPREDNISOLONE DOSE P (16)"
9      "MILLIPRED DP (13)"
10     "ZONACORT 7 DAY"

然后让它看起来像

ID     Product
6      "METHYLPREDNISOLONE TAB THERAPY PACK 4 MG (21)"
7      "DEXAMETHASONE TAB THERAPY PACK 1.5 MG (7)"
8      "METHYLPREDNISOLONE DOSE P (16)"
9      "MILLIPRED DP (13)"

实际上,我想根据最后一个字符是否是括号内的数字来过滤数据集。我尝试使用无济于事:

SELECT ID, Product
FROM DAT
WHERE product like '%[(][0-9][)]';

【问题讨论】:

  • Like 不使用正则表达式。
  • 问题是关于 regexp 的使用,并且该标签已由 OP 添加。
  • 顺便说一句,为什么这个标签是r
  • @mck 我的错!我习惯在r 中提问,但这是一个普遍的问题
  • 我已经删除了r 标签以避免混淆。由于这是在数据块上,您使用的是 Spark SQL 吗?

标签: sql regex apache-spark apache-spark-sql


【解决方案1】:

base R 中,我们可以使用grepl 匹配左括号(\\()后跟一个或多个数字(\\d+),然后是右括号(\\))在末尾(@ 987654326@) 的字符串

subset(df1, grepl("\\(\\d+\\)$", Product))
#    ID                                       Product
#6  6 METHYLPREDNISOLONE TAB THERAPY PACK 4 MG (21)
#7  7     DEXAMETHASONE TAB THERAPY PACK 1.5 MG (7)
#8  8                METHYLPREDNISOLONE DOSE P (16)
#9  9                             MILLIPRED DP (13)

数据

df1 <- structure(list(ID = 1:10, Product = c("VENLAFAXINE HCL CAP ER 24HR 37.5 MG (BASE EQUIVALENT)", 
"MINOXIDIL POWDER", "MENTHOL LOZENGE 10 MG", "ZINC CHLORIDE GRANULES", 
"CLOPIDOGREL BISULFATE TAB 75 MG (BASE EQUIV)", "METHYLPREDNISOLONE TAB THERAPY PACK 4 MG (21)", 
"DEXAMETHASONE TAB THERAPY PACK 1.5 MG (7)", "METHYLPREDNISOLONE DOSE P (16)", 
"MILLIPRED DP (13)", "ZONACORT 7 DAY")), class = "data.frame", row.names = c(NA, 
-10L))

【讨论】:

    【解决方案2】:

    很遗憾,SQL Server 不支持正则表达式。但你可以这样做:

    WHERE product like '%([0-9]%)' AND
          product NOT LIKE '%(%[^0-9]%)'
    

    第一个条件检查字符串末尾是否有括号,中间有一个数字。

    第二个验证括号之间的所有字符都是数字。

    也就是说,这并不完美,但如果product 中没有其他括号,它会起作用。

    【讨论】:

      【解决方案3】:

      您可以尝试使用RLIKE 来匹配正则表达式:

      SELECT ID, Product
      FROM DAT
      WHERE product RLIKE '\\([0-9]+\\)$';
      

      【讨论】:

        猜你喜欢
        • 2019-12-16
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 2022-07-01
        • 2011-07-14
        • 2012-06-14
        相关资源
        最近更新 更多