R中的正则表达式:从列中提取字符和数字

时间:2016-07-18 00:32:00

标签: regex r

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

对数据的观察:

  • 该栏目包含三大类:鞋类,上衣和下装。
  • 鞋类:单元格中的数字通常是大小,除此之外的任何东西都要单独存放。独特的案例看起来像 - 欧盟36(欧盟说它的欧洲大小需要转换),英国8(需要类似的转换),19宽,10个孩子,19(-25F)(在这种情况下,我真的不需要保存-25F信息)。
  • 上衣:这里的尺码通常是XXS,XS,S,M,L,XL,XXL,XXXL。任何其他字符串,如Tall,内缝等,需要单独存储。此外,像XXL这样的尺寸也可以表示为2XL。
  • Bottomwear:这里的尺寸通常在一开始就出现。它可以是数字32或字符XL(类似于topwear)。如果后面有任何其他字符串,则应单独存储。

谢谢!

1 个答案:

答案 0 :(得分: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