【问题标题】:In R, how to use regex to look for a PATTERN of strings?在 R 中,如何使用正则表达式来查找字符串的模式?
【发布时间】:2021-02-19 21:29:36
【问题描述】:

我正在尝试用一个空格替换数据集中每一行中的模式。

模式是: MM/DD/YYYY ##:##:## 人名 (PNAME)

每一行都是一个字符串,如:

[1] 之前的文本... 04/17/2014 08:46:42 John Doe (JDOE) ...之后的文本

期望的结果:

[1] 之前的文字... ...之后的文字

我尝试了以下(以及许多变体):

pattern <- "[[0-9]][[0-9]][[:punct:]][[0-9]][[0-9]][[:punct:]][[0-9]][[0-9]][[0-9]][[0-9]][[:space:]][[0-9]][[0-9]][[:punct:]][[0-9]][[0-9]][[:punct:]][[0-9]][[0-9]][[:space:]][[:alpha::]][[:space:]][[:alpha::]][[:punct:]][[:alpha::]][[:punct:]]) "
replacement <- " "

sub(pattern, replacement, data$Description)

看来我没有正确设置模式。我在这里阅读了一些数字或正则表达式问题,但没有一个使用尝试替换多个字符/单词的模式。你会怎么写?

【问题讨论】:

  • 您在0-9 周围添加了额外的括号,使用[0-9] 匹配单个数字
  • 试试gsub("\\s+\\d{1,2}/\\d{1,2}/\\d{4}\\s+\\d{1,2}:\\d{1,2}:\\d{1,2}\\s+\\w+\\s+\\w+\\s+\\([^()]*\\)", "", data$Description),见regex demo
  • @WiktorStribiżew 做到了!!!谢谢!

标签: r regex


【解决方案1】:

这里有几个问题:

  • [[0-9]] 匹配 [ 或数字,然后是 ],您只需 \d[0-9] 匹配数字
  • 要匹配您需要[[:alpha:]] 而不是[[:alpha::]] 的字母
  • 您无需手动键入多个[0-9][[:alpha:]],可以使用+ 或限制(范围)量词(如{1,2})。

你可以使用

gsub("\\s+\\d{1,2}/\\d{1,2}/\\d{4}\\s+\\d{1,2}:\\d{1,2}:\\d{1,2}\\s+\\w+\\s+\\w+\\s+\\([^()]*\\)", "", data$Description)

regex demo

详情

  • \s+ - 一个或多个空格
  • \d{1,2}/\d{1,2}/\d{4} - 类似日期的字符串(一位或两位,/,一位或两位,/,四位)
  • \s+ - 一个或多个空格
  • \d{1,2}:\d{1,2}:\d{1,2} - 类时间字符串
  • \s+\w+\s+\w+\s+ - 用一个或多个空格括起来的两个空格分隔的单词(也可以写成(?:\s+\w+){2}\s+
  • \( - 一个 ( 字符
  • [^()]* - 除了 () 之外的零个或多个字符
  • \) - ) 字符。

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 2016-08-16
    • 2019-02-09
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多