r 中的正则表达式。分组和捕获
Regular expression in r. Grouping & Capturing
我正在尝试在 R cran 中使用正则表达式,使用库 stringr
。我正在研究 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"
尝试只使用表达式 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 表达式,returns TRUEE
或 FALSE
。您可以使用 str_detect
方法而不是匹配方法吗?
POSIX和perl的区别造成的:
POSIX 引擎无法识别惰性(非贪婪)量词。
你的表情
(.+?)( PIAZZALE | SS)(.+?)([0-9]{5})
将被视为
的 perl 等价物
(.+)( PIAZZALE | SS)(.+)([0-9]{5})
其中第一个量化的 class .+
将在回溯和评估表达式的其余部分之前尽可能多地匹配(完整字符串)。当第一个量化 class .+
从字符串末尾一直返回并消耗字符 MONT SS DPR
时,它是成功的,只为第二个捕获组 SS
=27=]
发动机内部工作原理的简化说明
这里是对不同引擎如何处理您的字符串的简单说明。您的所有 quantifiers/alternation 都直接包含在捕获组中,因此以下示例中带编号的量词也是您的捕获组:
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
我正在尝试在 R cran 中使用正则表达式,使用库 stringr
。我正在研究 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"
尝试只使用表达式 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 表达式,returns TRUEE
或 FALSE
。您可以使用 str_detect
方法而不是匹配方法吗?
POSIX和perl的区别造成的:
POSIX 引擎无法识别惰性(非贪婪)量词。
你的表情
(.+?)( PIAZZALE | SS)(.+?)([0-9]{5})
将被视为
的 perl 等价物(.+)( PIAZZALE | SS)(.+)([0-9]{5})
其中第一个量化的 class .+
将在回溯和评估表达式的其余部分之前尽可能多地匹配(完整字符串)。当第一个量化 class .+
从字符串末尾一直返回并消耗字符 MONT SS DPR
时,它是成功的,只为第二个捕获组 SS
=27=]
发动机内部工作原理的简化说明
这里是对不同引擎如何处理您的字符串的简单说明。您的所有 quantifiers/alternation 都直接包含在捕获组中,因此以下示例中带编号的量词也是您的捕获组:
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