【问题标题】:R - Regular expression to match all punctuation except that inside of a URLR - 正则表达式匹配除了 URL 内部的所有标点符号
【发布时间】:2017-12-21 22:11:35
【问题描述】:

基本上,我正在寻找一个正则表达式来选择所有标点符号,但 URL 内的标点符号除外。

本质上,如果我有字符串:

This is a URL: https://test.com/ThisIsAURL !

并删除它应该成为的所有匹配项:

This is a URL https://test.com/ThisIsAURL

gsub("[[:punct:]]", "", x) 删除所有标点符号,包括 URL 中的标点符号。我曾尝试使用否定的后视来选择 https 之后使用的标点符号,但没有成功。

在我需要它的情况下,所有 URL 都是 Twitter 链接式 URL https://t.co/。它们不以.com 结尾。他们也没有不止一个反斜杠 (/ThisIsAURL)。但是,理想情况下,我希望正则表达式尽可能多才多艺,能够在任何 URL 上成功执行此操作。

【问题讨论】:

  • 必须是R 吗?这在例如非常简单Python.
  • 嗨 Jan。是的,它必须是 R。这是我的困境。
  • 你能准确定义“标点符号”是什么意思吗?
  • 所有 URL 都以 'http' 开头吗?
  • 嗨拉米亚。所有 URL 都以 http 或 https 开头。我将在问题中添加一些内容,以说明在这种情况下什么是 URL。

标签: r regex text-mining


【解决方案1】:

您可以将类似 URL 的模式(如 https?://\S*)匹配并捕获到第 1 组,然后匹配任何标点符号并替换为对第 1 组的反向引用,以恢复结果字符串中的 URL:

x <- "This is a URL: https://test.com/ThisIsAURL !"
trimws(gsub("(https?://\\S*)|[[:punct:]]+", "\\1", x, ignore.case=TRUE))
## => [1] "This is a URL https://test.com/ThisIsAURL"

请参阅R demo online

正则表达式是

(https?://\S*)|[[:punct:]]+

请参阅regex demo

详情

  • (https?://\S*) - 第 1 组(参考替换模式中的 \1):
    • https?:// - https://http://
    • \S* - 0+ 个非空白字符
  • | - 或
  • [[:punct:]]+ - 1+ 标点符号(正确的标点符号、符号和 _

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-06-20
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
相关资源
最近更新 更多