R - 正则表达式从字符串

时间:2015-11-16 05:20:01

标签: regex r

我有以下数据 -

PLAYSTORE BANGKOK
FLOAT@THE BAY          SINGAPORE
YANTRA                 SINGAPORE
AIRASIA_QS9DQQL        SINGAPORE

我想删除每个字符串中的最后一个单词,如果它在我正在寻找的城市列表中使用 -

sub('(?i)^(.*)\\b(singapore|stockholm|singapor|bangkok|kuala lumpur|london|tokyo)$','\\2', merch_desc$desc2 )

但\ 1或\ 2不起作用,我再次得到完整的字符串。有没有办法纠正这个?

我想要2个输出 - 1个带有公司名称,另一个带有2个单独的向量位置。

merch_desc $ merch -

  PLAYSTORE 
    FLOAT@THE BAY          
    YANTRA                 
    AIRASIA_QS9DQQL      

merch_desc $ loc -

BANGKOK
SINGAPORE
SINGAPORE
SINGAPORE

它似乎很奇怪,它适用于字符串,但不适用于数据框 -

test$desc2
[1] "qoo10                  singapore    " "bill payment via internet banking"    "mcdonald's restaurants singapore    "
[4] "hdb season parking     singapore    " "grabtaxi pte ltd       singapore    "

这不起作用 -

sub('^.* (singapore|stockholm|singapor|bangkok|kuala lumpur|london|tokyo)$', '\\1', test$desc2 )
[1] "qoo10                  singapore    " "bill payment via internet banking"    "mcdonald's restaurants singapore    "
[4] "hdb season parking     singapore    " "grabtaxi pte ltd       singapore    "

但这有效 -

sub('^.* (singapore|stockholm|singapor|bangkok|kuala lumpur|london|tokyo)$', '\\1', 'tigerair y843km singapore' )
[1] "singapore"

编辑2 -

使用trimws()。没有Trimws它不会处理多个空格。

谢谢, 和Manish

1 个答案:

答案 0 :(得分:3)

我们可以使用sub中的pattern将子字符串捕获为组,然后在,中的捕获组之间添加分隔符(replacement),将其用作sep中的read.table。如果存在领先/滞后空格,请通过str_trimstringr通过循环遍历列将其删除。

library(stringr)
d1 <- read.table(text=sub('(.*)\\s+(\\S+)$', '\\1,\\2', v1),sep=',')
d1[] <- lapply(d1, str_trim)
d1
#              V1        V2
#1       PLAYSTORE   BANGKOK
#2   FLOAT@THE BAY SINGAPORE
#3          YANTRA SINGAPORE
#4 AIRASIA_QS9DQQL SINGAPORE

或者根据@RichardScriven的建议,修剪前导/后退空格的base R选项为trimws

d1[] <- lapply(d1, trimws)

数据

v1 <- c('PLAYSTORE BANGKOK','FLOAT@THE BAY          SINGAPORE',
       'YANTRA                 SINGAPORE',
        'AIRASIA_QS9DQQL        SINGAPORE')