【问题标题】:Regular Expression in R: extract characters and numbers from a column [closed]R中的正则表达式:从列中提取字符和数字[关闭]
【发布时间】:2016-07-18 00:32:00
【问题描述】:

我正在使用具有尺寸描述列的零售数据集。我的任务是清理列并将数字大小与字符串中的字符分开。有没有办法通过正则表达式来做到这一点?我需要将列中存在的数字和任何其他字符串都保存在两个不同的列中。

对数据的观察:

  • 该列包含三大类的尺码:鞋类、上衣和下装。
  • 鞋类:单元格中的数字通常是尺码,除此之外的任何东西都要单独存放。独特的案例看起来像 - EU 36(欧盟表示其欧洲尺寸,因此需要转换),UK 8(需要类似转换),19 Wide,10 Kids,19(-25F)(在这种情况下,我真的不需要保存 -25F 信息)。
  • 上衣:这里的尺码一般是XXS,XS,S,M,L,XL,XXL,XXXL。与它一起的任何其他字符串,如 Tall、inseam 等都需要单独存储。此外,像 XXL 这样的尺寸也可以表示为 2XL。
  • 底裤:这里的尺码一般出现在开头。它可以是数字 - 32 或字符 - XL(类似于上衣)。如果后面有其他字符串,应单独存放。

谢谢!

【问题讨论】:

  • 你能显示更多数据吗?使用regular expression 需要想出一个模式,而仅仅一行文本不足以创建一个一致的模式。
  • 是的,至少显示三行输入,例如,还显示与输入对应的输出应该是什么样子。同时显示您所做的任何尝试的代码。
  • 您还需要向我们指定(如果您还没有)是否需要识别“F”、英寸双引号和度数符号,而不考虑数据行中的顺序。
  • 根据收到的 cmets 编辑,如有遗漏请告诉我。

标签: regex r


【解决方案1】:

这里有一个用于多种情况的正则表达式。
它适用于示例。

details <- c("EU 36", "UK 8", "19 Wide", "10 Kids", "19(-25F)", "XXS", "XS is Extra Small", "S", "M", "L", "XL", "XXL", "XXXL", "2XL", "32")

pattern = "\\b(?:(?:(?:2?X*(?:S|L))|M|(?:EU|UK) [0-9]+)|(?:[0-9]{2}(?: (?:Kids|Wide))?))\\b"

matches <- regexpr(pattern, details)

regmatches(details, matches)

正则表达式的分解:

\b    # Word boundary: a position between a word and non-word character 
      # (includes the start/end of the line).
  (?:       # a non-capturing group
    (?:     # ditto
      (?:   # ditto
         2?  # 0 or 1 "2" characters
           X*  # 0 or more "X" characters
             (?:S|L) # "S" or an "L" character
      )
      |    # or
       M   # the "M" character
      |    # or 
       (?:EU|UK) [0-9]+  # "EU" or "UK", followed by a space and 1 or more digits
      |    # or
       (?:[0-9]{2}(?: (?:Kids|Wide))? # 2 digits optionally followed by " Kids" or " Wide"
    )
  )
\b  # Word boundary

【讨论】:

  • 嘿,非常感谢@LukStroms,这很有帮助。您能否详细说明如何理解这个正则表达式?很抱歉,但我对使用这些进行文本分析还很陌生。
  • 添加了对答案中使用的正则表达式的详细说明。 Regular expressions 在互联网出现之前就已经存在。因此,查找文档甚至 online tester 很容易。
猜你喜欢
  • 1970-01-01
  • 2018-11-28
  • 2014-03-04
  • 2022-01-10
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
相关资源
最近更新 更多