我试图从一个字符串中获取RegExp的所有匹配,但显然它在R中并不那么容易,或者我忽略了一些东西。说实话,这真的令人困惑,我发现自己迷失在所有选项中:str_extract
,str_match
,str_match_all
,regexec
,grep
,{{1谁知道有多少人。
实际上,我想要完成的只是(在Python中):
gregexpr
上述功能的问题是,他们要么返回一个匹配,要么根本不返回任何匹配。
答案 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))
如果你想使用 stringr 包(在幕后使用ICU正则表达式库),你需要str_extract_all
:
res <- str_extract_all(s, "[\\w']+|[.,;:?!]")