我正在尝试使用库stringr
在R cran中使用regexp。我正在研究str_match
和str_replace
函数。我不明白为什么当我使用括号进行分组时它们会给出不同的结果:
library(stringr)
s<-"(.+?)( PIAZZALE | SS)(.+?)([0-9]{5})"
a<-str_match("MONT SS DPR PIAZZALE CADORNA, 1A RICCIONE 47838",perl(s))
b<-str_replace("MONT SS DPR PIAZZALE CADORNA, 1A RICCIONE 47838",perl(s), "\\2")
a[3]
#[1] " PIAZZALE "
b
#[1] " SS"
答案 0 :(得分:1)
尝试仅使用表达式s
而不是perl(s)
:
library(stringr)
s<-"(.+?)( PIAZZALE | SS)(.+?)([0-9]{5})"
a<-str_match("MONT SS DPR PIAZZALE CADORNA, 1A RICCIONE 47838",s)
b<-str_replace("MONT SS DPR PIAZZALE CADORNA, 1A RICCIONE 47838",s, "\\2")
a[3]
#[1] " PIAZZALE "
b
#[1] " PIAZZALE "
我已查看过此库的文档: http://cran.r-project.org/web/packages/stringr/stringr.pdf
它表明虽然str_replace
方法默认情况下可以接受POSIX模式,而且如果提供了perl模式,str_match
只能接受POSIX样式模式,并且如果提供了perl模式。他们提供不同值的原因是他们使用不同的表达引擎。 str_detect
可以使用perl表达式并返回TRUEE
或FALSE
。您是否可以使用str_detect
方法而不是匹配方法?
POSIX引擎无法识别懒惰(非贪婪)量词。
你的表达
(.+?)( PIAZZALE | SS)(.+?)([0-9]{5})
将被视为
的perl等价物(.+)( PIAZZALE | SS)(.+)([0-9]{5})
在回溯并评估表达式的其余部分之前,第一个量化类.+
将尽可能多地匹配(完整字符串)。当第一个量化的类.+
从字符串的末尾返回并消耗字符MONT SS DPR
时,它只会为第二个捕获组SS
留下a[3]
,这是成功的
以下是不同引擎处理字符串的简化说明。所有量词/替换都直接包含在捕获组中,因此以下示例中的编号量词也是您的捕获组:
<强>的Perl:强>
Quantifier 1: "M"
Quantifier 2: FAILED - MUST BACKTRACK
Quantifier 1: "MO"
Quantifier 2: FAILED - MUST BACKTRACK
Quantifier 1: "MON"
Quantifier 2: FAILED - MUST BACKTRACK
Quantifier 1: "MONT"
Quantifier 2: " SS"
Quantifier 3: " "
Quantifier 4: FAILED - MUST BACKTRACK
Quantifier 1: "MONT"
Quantifier 2: " SS"
Quantifier 3: " D"
Quantifier 4: FAILED - MUST BACKTRACK
...
Quantifier 1: "MONT"
Quantifier 2: " SS"
Quantifier 3: " DPR PIAZZALE CADORNA, 1A RICCIONE "
Quantifier 4: "47838"
SUCCESS
<强> POSIX:强>
Quantifier 1: "MONT SS DPR PIAZZALE CADORNA, 1A RICCIONE 47838"
Quantifier 2: FAILED - MUST BACKTRACK
Quantifier 1: "MONT SS DPR PIAZZALE CADORNA, 1A RICCIONE 4783"
Quantifier 2: FAILED - MUST BACKTRACK
Quantifier 1: "MONT SS DPR PIAZZALE CADORNA, 1A RICCIONE 478"
Quantifier 2: FAILED - MUST BACKTRACK
Quantifier 1: "MONT SS DPR PIAZZALE CADORNA, 1A RICCIONE 47"
Quantifier 2: FAILED - MUST BACKTRACK
...
Quantifier 1: "MONT SS DPR P"
Quantifier 2: FAILED - MUST BACKTRACK
Quantifier 1: "MONT SS DPR "
Quantifier 2: FAILED - MUST BACKTRACK
Quantifier 1: "MONT SS DPR "
Quantifier 2: " PIZZALE "
Quantifier 3: "CADORNA, 1A RICCIONE 47838"
Quantifier 4: FAILED - MUST BACKTRACK
...
Quantifier 1: "MONT SS DPR "
Quantifier 2: " PIZZALE "
Quantifier 3: "CADORNA, 1A RICCIONE "
Quantifier 4: "47838"
SUCCESS