【问题标题】:Extract just the part of string that matches a regex pattern in R仅提取与 R 中的正则表达式模式匹配的字符串部分
【发布时间】:2016-08-12 17:31:19
【问题描述】:

我构建了一个从网页中自动废弃的数据框,其中一个变量是文本形式“5 月 12 日”中的日期。

尽管如此,有时观察结果会在日期之后附加一些字符(在某些情况下是奇怪的字符),例如:“May 20 õ”、“Dez 1”、“Oct 12ABCdáé”。 对于这些情况,我想用正确的字符替换该值,例如:“Dec 24”、“Oct 1”。

在多次谷歌搜索解决方案并尝试以下功能后:sub、gsub 和 grep,我找不到找到正确功能的方法。

我看到正则表达式的学习曲线很陡峭,但在使用工具http://regexr.com/ 之后,我可以定义正则表达式以匹配出现问题的观察中的模式。 ([A-Z]{1}[a-z]{2})\s\d+.*

此时,我有以下示例:

vector = c("May 20", "Dez 1", "Oct 12ABCdáé”)

我尝试的最后一个解决方案是:

dateformat = gsub(pattern = "([A-Z]{1}[a-z]{2})\\s\\d+.*", replacement = "([A-Z]{1}[a-z]{2})\\s\\d+", x = vector)

当然,这给了我一个替换为每个文本字符串“([A-Z]{1}[a-z]{2})\s\d+”。

> dateformat
[1] "([A-Z]{1}[a-z]{2})sd+" "([A-Z]{1}[a-z]{2})sd+"
[3] "([A-Z]{1}[a-z]{2})sd+"

我真的不明白我必须在替换参数中包含什么才能删除坏字符(如果它们存在)。

【问题讨论】:

  • regexr 还具有替换功能。 replacement = ... 也可以这样测试。
  • 正则表达式用于搜索文本。正则表达式不打算在替换模式中使用。您可以使用regexpr 来获取匹配的字符串。
  • 如果你的最终目标是约会,as.Date(c("May 20", "Dec 1", "Oct 12ABCdáé"), "%B %d") 会不会很简单?注意:我不知道是拼写错误还是特殊字符。另外,如果您不通过年份, as.date 会考虑当前年份

标签: regex r split truncation


【解决方案1】:

我添加了一个捕获组和一个反向引用"\\1"

sub("^([A-Z]{1}[a-z]{2}\\s\\d+).*", "\\1", vector)
[1] "May 20" "Dez 1"  "Oct 12"

替换参数接受像'\\1' 这样的反向引用,但不接受您使用的典型正则表达式模式。反向引用引用您创建的模式和您定义的捕获组。在这种情况下,我们的捕获组是缩写的月份和日期,我们用附注列出了 (..)。当"\\1" 被放置在替换参数中时,在这些括号内捕获的任何文本都会返回。

这个quick-start guide 可能会有所帮助

【讨论】:

  • OP 的实际问题似乎是对 RegEx 替换功能的误解,因此可能值得少说几句关于它的内容,以及为什么他的替换字符串没有按照他的预期做; -)
【解决方案2】:

我们也可以试试

sub("\\s*[^0-9]+$", "", vector)
#[1] "May 20" "Dez 1"  "Oct 12"

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多