R相当于Python的re.findall

时间:2017-04-13 20:57:48

标签: python r regex

我试图从一个字符串中获取RegExp的所有匹配,但显然它在R中并不那么容易,或者我忽略了一些东西。说实话,这真的令人困惑,我发现自己迷失在所有选项中:str_extractstr_matchstr_match_allregexecgrep,{{1谁知道有多少人。

实际上,我想要完成的只是(在Python中):

gregexpr

上述功能的问题是,他们要么返回一个匹配,要么根本不返回任何匹配。

1 个答案:

答案 0 :(得分:5)

通常,没有R完全等效于Python re.findall,它返回一个匹配值列表或(一个列表)包含捕获组子匹配的元组。最接近的是来自 stringr 包的str_match_all,但它也非常接近Python re.finditer(因为它返回第一项中的匹配值,然后是所有子匹配(在后续项目中捕获组内容(仍然不完全等同于re.finditer,因为只返回文本,而不是匹配数据对象))。因此,如果未使用str_match_all返回整个匹配值,则它将与Python re.findall完全等效。

您正在使用re.findall返回匹配,而不是捕获,您的模式中的捕获组是多余的,您可以将其删除。因此,您可以安全地使用regmatches gregexpr和PCRE风格(因为[\\w']不能使用TRE正则表达式):

s <- "This is starting to get really, really annoying!!"
res <- regmatches(s, gregexpr("[\\w']+|[.,;:?!]", s, perl=TRUE))
## => [[1]]
[1] "This"     "is"      "starting" "to"       "get"      "really"  
[7] ","        "really"   "annoying" "!"        "!"  

请参阅R demo

或者,要使\w支持Unicode,要使其在Python 3中工作,请添加(*UCP) PCRE动词:

res <- regmatches(s, gregexpr("(*UCP)[\\w']+|[.,;:?!]", s, perl=TRUE))

请参阅another R demo

如果你想使用 stringr 包(在幕后使用ICU正则表达式库),你需要str_extract_all

res <- str_extract_all(s, "[\\w']+|[.,;:?!]")