2017-04-02 89 views
0

我无法理解以下代码行中正则表达式的含义。在r中解析sub和gsub的正则表达式

author = "10_1 A Kumar; Ahmed Hemani ; Johnny &Ouml;berg<" 

# after some experiment, it looks like this line captures whatever is in 
# front of the underscore. 
authodid = sub("_.*","",author) 

# this line extracts the number after the underscore, but I don't know 
# how this is achieved 
paperno <- sub(".*_(\\w*)\\s.*", "\\1", author) 

# this line extracts the string after the numbers 
# I also have no idea how this is achieved through the code 
coauthor <- gsub("<","",sub("^.*?\\s","", author)) 

我已经在网上看到第一个参数是模式,第二个是替换,第三个是对象操作。我也在SO上看到了一些帖子,并得知\\w表示一个字,\\s是一个空格。

但是,有几件事情还不清楚。 \\w表示单词,是否表示下一个单词?如果不是,我应该如何解释?我了解到^匹配字符串的开始,但^之后的那段时间呢?

更重要的是,什么是_.*的解释.*_^.*?\\s怎么样?我应该如何阅读它们?

谢谢!

+3

在这里键入这些东西https://regex101.com – rawr

+0

@rawr我应该选择哪种味道?似乎所有人都显示错误。 – Waht

+1

[pcre应该没问题](https://regex101.com/r/sIb7Ql/1),我没有得到一个错误,也许你是因为双\这是不需要的,当你使用这个网站 – rawr

回答

1

好吧。有很多问题。首先要做的事情。

sub("_.*","",author)寻找_以及其后的所有内容。所以在你的情况下_.*对应于_1 A Kumar; Ahmed Hemani ; Johnny &Ouml;berg<。函数sub以''复位(因此,事实上它会将其删除),所以最终结果为10

sub(".*_(\\w*)\\s.*", "\\1", author)比较棘手(没有任何理由)。它不提取任何东西。如果将代码替换为sub(".*_(\\w*)\\s.*", "222", author),结果将为222(而不是1)。所以,无论你放在第二个参数中,你都会得到结果。为什么如此?那么,因为".*_(\\w*)\\s.*"对应整个字符串,即:.*_对应于10_; (\\w*)对应于1,最后\\s.*意味着空间和它后面的所有内容(所以,字符串的其余部分)。

gsub("<","",sub("^.*?\\s","", author))有两个功能。第一个sub("^.*?\\s","", author)。它看起来从头到脚都是一切。所以^.*?\\s代表10_1并将其删除。所以,你最终得到A Kumar; Ahmed Hemani ; Johnny &Ouml;berg<。第二个从各地删除'<'。

我希望它有帮助。

+0

是否正确:'_。*'在'_'之后查找所有内容,并对其进行操作,'。* _'在'_'之前查找所有内容并对其执行操作,'^。*?'外观从一开始直到它找到指定的东西(在我的情况下,'\\ s',一个空格)并对其进行操作? – Waht

+0

@短答案是肯定的。 – Vyga