Python R regex从字符串中提取信息
有人告诉我R是数据处理的好工具。因此,我试图弄清楚是否可以(容易地)用R进行正则表达式数据提取 下面是从Python中提取两个关键信息的示例:Python R regex从字符串中提取信息,python,regex,r,Python,Regex,R,有人告诉我R是数据处理的好工具。因此,我试图弄清楚是否可以(容易地)用R进行正则表达式数据提取 下面是从Python中提取两个关键信息的示例: import re str = "oh, 100.0 dollar is 621.5 yuan" m = re.search("([\d+\.\d+]+).*?([\d+\.\d+]+)",str) if m: print m.group(1),"->",m.group(2) Python的输出是: 100.0 -> 621.5
import re
str = "oh, 100.0 dollar is 621.5 yuan"
m = re.search("([\d+\.\d+]+).*?([\d+\.\d+]+)",str)
if m:
print m.group(1),"->",m.group(2)
Python的输出是:
100.0 -> 621.5
Python带来了非常酷的结果,但是如何在R中高效地实现呢?当然。类似的事情也很容易通过BaseR或其众多包中的一个实现。下面是一个使用“stringi”包的示例
嗯,您的正则表达式不正确,并且与您期望的匹配。定义一组字符。说“匹配一个类指定的字符” 因此,它符合以下条件:
[\d+\.\d+]+ # any character of: digits (0-9), '+', '\.', digits (0-9), '+'
# (1 or more times)
使用base R,您可以使用以下模式使用regmatches
和gregexpr
:
x <- 'oh, 100.0 dollar is 621.5 yuan'
m <- regmatches(x, gregexpr('\\d+(?:\\.\\d+)?', x, perl=T))[[1]]
paste(m[1], '->', m[2])
# [1] "100.0 -> 621.5"
这里有一些方法。其他的也可以使用各种其他包 1)它可以用
Straply
在一行中完成(尽管为了可读性,我们将它分成两行)Straply
将模式pat
应用于字符串str
,然后将捕获的字符串输入函数(此处以公式表示法表示),并返回结果:
library(gsubfn)
# test data
str <- "oh, 100.0 dollar is 621.5 yuan"
pat <- "([\\d+\\.\\d+]+).*?([\\d+\\.\\d+]+)"
strapply(str, pat, ~ paste(x, "->", y), simplify = TRUE)
注意我们使用了与问题中相同的正则表达式,以表明python正则表达式也在R中工作(尽管我们在写出它时需要将反斜杠加倍,因为“\\”表示一个反斜杠);但是,我们可以使用以下方法稍微简化正则表达式:
pat <- "(\\d+\\.\\d+).*?(\\d+\\.\\d+)"
给出同样的答案
3)另一种方法是将输入拆分为单词,然后只保留表示数字的单词。此软件包不使用任何软件包:
g <- grep("\\d+\\.\\d+", strsplit(str, " ")[[1]], value = TRUE)
paste(g[1], "->", g[2])
g以下是一系列gsub
函数
> str = "oh, 100.0 dollar is 621.5 yuan"
> sub("[[:space:]]+", " -> ", gsub("^[[:space:]]+|[[:space:]]+$", "", gsub("(\\d+(?:\\.\\d+)?)|\\S", '\\1', str, perl=T)))
[1] "100.0 -> 621.5"
如果输入包含两个以上的数字,请尝试此操作。我刚刚将上面的sub
函数替换为gsub
> str = "oh, 100.0 dollar is 621.5 yuan 700 to 888.78"
> gsub("[[:space:]]+", " -> ", gsub("^[[:space:]]+|[[:space:]]+$", "", gsub("(\\d+(?:\\.\\d+)?)|\\S", '\\1', str, perl=T)))
[1] "100.0 -> 621.5 -> 700 -> 888.78"
[[:space:]+
POSIX字符类,它匹配一个或多个空格。Python也有许多用于数据处理的工具。你不需要学习R就可以做到这一点。R也支持正则表达式,你试过什么了吗?我本来打算用stri_match_all
,但这同样好:)这个例子两种模式是相同的,如果是不同的模式呢?例如,第一个匹配数字,第二个匹配字符串?@Beatlej,那么您需要提供一个更具体的正则表达式,也许可以使用模式中的
来指定选项。@Beatlej您需要使用交替。i、 e.\\d+(?:\\.\\d+)(…)
很好,但是如果不匹配,m[1]和m[2]是什么?为什么不试试看呢?问题不清楚,但所有的答案在str
上都给出了相同的结果。好吧,这就是海报使用的正则表达式,所以我使用了相同的正则表达式来说明python正则表达式在R中也起作用(反斜杠的模加倍)因为我认为这是问题的重点。我将在此添加一个注释。
pat <- "(\\d+\\.\\d+).*?(\\d+\\.\\d+)"
pat <- "([\\d.]+).*?([\\d.]+)"
s <- strapplyc(str, "\\d+\\.\\d+")[[1]]
paste(s[1], "->", s[2])
g <- grep("\\d+\\.\\d+", strsplit(str, " ")[[1]], value = TRUE)
paste(g[1], "->", g[2])
> str = "oh, 100.0 dollar is 621.5 yuan"
> sub("[[:space:]]+", " -> ", gsub("^[[:space:]]+|[[:space:]]+$", "", gsub("(\\d+(?:\\.\\d+)?)|\\S", '\\1', str, perl=T)))
[1] "100.0 -> 621.5"
> str = "oh, 100.0 dollar is 621.5 yuan 700 to 888.78"
> gsub("[[:space:]]+", " -> ", gsub("^[[:space:]]+|[[:space:]]+$", "", gsub("(\\d+(?:\\.\\d+)?)|\\S", '\\1', str, perl=T)))
[1] "100.0 -> 621.5 -> 700 -> 888.78"