【问题标题】:R Ignore character within a Regex stringR 忽略正则表达式字符串中的字符
【发布时间】:2018-05-14 23:00:30
【问题描述】:

我到处寻找一些regex,它们会导致R 忽略正则表达式字符串中的下一个字符。

例如,给定myvector:

 myvector <- c("abcdef", "ghijkl", "mnopqrs")

还有一个regex 字符串:

 regexstring <- "[a-z]{3}XXXXXXXXX "

其中包含一些未知字符 XXXXXXXXX,我想告诉R 忽略正则表达式字符串本身的最后一个空格。

运行以下命令后,

regexstring <- "[a-z]{3} "
sub(regexstring, " ", myvector)

给予,

"abcdef"  "ghijkl"  "mnopqrs"

因为任何字符串中都没有空格。但希望在包含 XXXXXXXXX 之后,我会得到与运行时相同的输出

regexstring <- "[a-z]{3}"
sub(regexstring, " ", myvector)

这是:

 " def"  " jkl"  " pqrs"

我无法擦除最后的空间或使用 trimws() 等,而且我看不出有什么方法可以让 R 忽略最后的空间。有没有 XXXXXXXXX 这样做的?

【问题讨论】:

  • trimws(regexstring, which="right") ?
  • 就像我说的,我不能擦除最后的空间。
  • 我不能在最后一个空格后面放任何东西。我有一个正则表达式向量,并且所有这些都附加了一个空格。因此,如果可能的话,我需要在正则表达式的第一部分中执行此操作。
  • 您可以添加(?x)(在XXXs所在的地方)并确保通过perl=TRUE
  • regexstring

标签: r regex string replace


【解决方案1】:

可以通过使用(?x) free-spacing inline modifier 代替XXXs 将最终空间设置为格式化空间,并传递perl=TRUE 参数以确保使用PCRE 正则表达式引擎解析模式。

myvector <- c("abcdef", "ghijkl", "mnopqrs")
regexstring <- "[a-z]{3}(?x) "
sub(regexstring, " ", myvector, perl=TRUE) 
## => [1] " def"  " jkl"  " pqrs"

请参阅R demo

请注意,将(?x) 放在模式的中间会影响模式中位置之后(右侧)使用的任何文字空格,直到模式结束,或者直到 (?-x) 修饰符选项。

【讨论】:

    【解决方案2】:

    基于 Wiktor Stribizew 的回答,我能够弄清楚如何使用 stringr 做到这一点:

    require(stringr)
    myvector    <- c("abcdef", "ghijkl", "mnopqrs")
    regexstring <- regex("[a-z]{3}# ", comments = T)
    myvector %>% str_replace(regexstring, " ")
    
    [1] " def"  " jkl"  " pqrs"
    

    这样,我可以修改正则表达式字符串本身(regexstring),而不是替换命令(sub 或 str_replace)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2015-06-25
      • 2020-05-01
      相关资源
      最近更新 更多