【问题标题】:Extracting desired text from the string using regular expression using R [duplicate]使用 R [重复] 使用正则表达式从字符串中提取所需文本
【发布时间】:2017-04-11 01:56:39
【问题描述】:

我正在读取 data.csv 文件的列,并尝试使用正则表达式从列中的字符串中的最后一个正斜杠之前提取所需的文本。我的列数据如下所示:

class:

org/apache/flume/api/virtual/loeadBalancing.java
org/apache/flume/file/Channel/testing/test2.java
org/apache/flume/recoverable/memory/test1.java
org/apache/flume/source/scribe/LogEntry.java
org/apache/flume/source/jms/TestJMSMessageConsumer.java

我想要的输出是:

org/apache/flume/ap/virtual
org/apache/flume/file/Channel/testing
org/apache/flume/recoverable/memory
org/apache/flume/source/scribe
org/apache/flume/source/jms/TestJMSMessageConsumer

所以,基本上,我试图从类列中提取子字符串,不包括出现在它之后的文本和反冲。我当前的代码是:

dfkg<- gsub( "\\.[^/]*$", "", data$class) 

有人可以更正我的常规字符串以生成所需的输出吗?

【问题讨论】:

  • 你的声明extract desired text before the last forward slash from strings,那为什么最后一个是rg/apache/flume/source/jms/TestJMSMessageConsumer
  • dirname(data$class)
  • 抱歉打错了。现已更正。
  • 我的意思是 org/apache/flume/source/jms/TestJMSMessageConsumer.java 应该是 org/apache/flume/source/jms

标签: r regex


【解决方案1】:

我们可以匹配/ 后跟一个或多个不是/ 的字符([^/]+),直到字符串的末尾($) 并将其替换为空白("")。

sub("/[^/]+$", "", data$class)
#[1] "org/apache/flume/api/virtual"          "org/apache/flume/file/Channel/testing" "org/apache/flume/recoverable/memory"  
#[4] "org/apache/flume/source/scribe"        "org/apache/flume/source/jms"      

在 OP 的代码中

gsub( "\\.[^/]*$", "", data$class) 

它匹配一个点 (\\.) 后跟零个或多个不是/ ([^/]*) 的字符,直到字符串的末尾 ($)。因此,基本上它将首先匹配.java 处的.,然后是没有任何/java,并将其替换为""


基于 OP 的 cmets,

sub("\\.[^.]+\\.[^.]+$", "", 'org.apache.flume.api.virtualloeadBalancing.java' )
#[1] "org.apache.flume.api"

【讨论】:

  • 它有效。你能解释一下我的代码中的问题吗?
  • 是的。它现在可以工作了。
  • 你能解释一下我的代码中的问题吗?只是需要另一个更正,在得到这个之后,我怎样才能用“。”替换反斜杠。点?
  • @Analyzer 你是不是想拥有"org.apache.flume.api.virtual" 在那种情况下gsub("[/]", ".", sub("\\/[^/]+$", "", data$class))
  • 谢谢。它工作得很好。但是,我需要检查我的正则表达式并了解 sub 和 gsub 之间的区别。 Sub 可能用于对文本进行子字符串化,而 gsub 更具体用于替换文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2019-06-16
  • 2017-10-02
相关资源
最近更新 更多