正则表达建议

时间:2014-03-13 20:45:18

标签: regex r

我正在试图找出如何在字符串中提取名称:

str <- "Bob 1/4 F4 Mary Lou 5/1 Thomas Tank 66/19"

到一个向量: “Bob”,“Mary Lou”,“Thomas Tank”

我有以下内容返回“Bob”。谁能告诉我如何在全球范围内匹配以下内容?

cVec <- ""
findMatch <- regexpr("[^0-9]+", str)
cVec       <- append(cVec, regmatches(str,findMatch))
cVec

理想情况下,我想要一个包含名称和分数元素的列表,例如 “鲍勃”,“1/4” “Mary Lou”,“5/1” “托马斯坦克”,“66/19” 但我怀疑F4会很困难(不需要)。我会满足于这些名字!

干杯。

5 个答案:

答案 0 :(得分:4)

您可以使用以下命令提取名称和分数:

regmatches(str, gregexpr("[[:alpha:]]+( [[:alpha:]]+)?\\b|\\d+/\\d+", str))
# [[1]]
# [1] "Bob"         "1/4"         "Mary Lou"    "5/1"         "Thomas Tank"
# [6] "66/19"      

答案 1 :(得分:2)

我不知道R,所以我无法为您提供实施。但是,我认为可以用这个正则表达式做出解决方案:

(?<=^| )[a-zA-Z]+(?: [a-zA-Z]+)?(?= |$)|[0-9]+/[0-9]+

它将匹配Bob1/4Mary Lou5/1Thomas Tank66/19,但不匹配F4

在线解释和演示:http://regex101.com/r/vB8rU5

答案 2 :(得分:0)

我不熟悉R的正则表达式语法,但以下Java正则表达式匹配整个表达式(\s表示空格; \d表示数字,{{1} }; [0-9]是一个群体; R似乎同意):

()

在Java中,有"([A-Za-z]+\\s)+(\\d+/\\d+(\\s[A-Z][\\d+])?)" 方法,可以让您浏览模式匹配。在R中,我认为它是find,除了这给你一个索引列表,而不是字符串本身。

答案 3 :(得分:0)

在一天结束时,这是模糊的方式,以提供可靠/通用的解决方案。但这可以解决问题,你只需修改名称:

> strsplit(str, "[0-9][ 0-9F/]+[0-9]")[[1]]
[1] "Bob "          " Mary Lou "    " Thomas Tank "

正则表达式定义了拆分的样子。

答案 4 :(得分:0)

你可以这样做:

str <- "Bob 1/4 F4 Mary Lou 5/1 Thomas Tank 66/19"
m<-gregexpr("(?i)\\b[a-z]+(?: [a-z]+)*\\b", str)
regmatches(str, m)