首页 > 解决方案 > 在 R 中,如何使用正则表达式来查找字符串的模式?

问题描述

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

模式为: 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)

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

标签: rregex

解决方案


这里有几个问题:

  • [[0-9]]匹配[or 一个数字,然后是 a ],你只需要\dor[0-9]来匹配一个数字
  • 匹配一个你需要[[:alpha:]]而不是的字母[[:alpha::]]
  • 您不需要手动键入多个[0-9]or [[: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)

查看正则表达式演示

细节

  • \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+
  • \(- 一个(字符
  • [^()]*(- 除了and之外的零个或多个字符)
  • \)- 一个)字符。

推荐阅读