Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python R regex从字符串中提取信息_Python_Regex_R - Fatal编程技术网

Python R regex从字符串中提取信息

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

有人告诉我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

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"