r:如何将值插入特定模式

时间:2018-04-26 21:21:11

标签: r regex

我正在尝试为一系列值添加特殊字符。但我不知道如何。

以下是原始输入:

 mAPIService = ApiUtils.getAPIService();
     mAPIService.savePost(category).enqueue(new Callback<List<DataStored>>() {
            @Override
            public void onResponse(Call<List<DataStored>> call, Response<List<DataStored>> response) {
                dataStored=  response.body();
                myRecyclerAdapter.addItems(dataStored);
            }

            @Override
            public void onFailure(Call<List<DataStored>> call, Throwable t) {

            }
        });

我想要:

chemical <- "200mL of Ac2O3, 3.5mml of AgBF4, 10.0ml of AgBr, 100ml of AgCl3Cu2"

基本上,我在原始数据中的化学式中有一个数字之前和之后添加“〜”。

我试图使用gsub,但我不确定如何告诉R在化学式中找到那些数字然后插入。

有没有人想过这个?谢谢!

4 个答案:

答案 0 :(得分:4)

gsub("(?<=[A-Za-z])([0-9])","~\\1~",chemical,perl = T)
[1] "200mL of Ac~2~O~3~, 3.5mml of AgBF~4~, 10.0ml of AgBr, 100ml of AgCl~3~Cu~2~"

在这里,您需要使用正面回顾语法?<=来指定您希望数字前面有字母,大写或小写[A-z]。您可以使用数字括号来创建一个捕获组,使用\1进行调用,并使用\替换为~\\1~perl = T允许使用正面回顾语法

答案 1 :(得分:2)

与@denis类似,但不使用perl语法:

gsub("([A-Za-z])([0-9]+)","\\1~\\2~",chemical)

(根据@Wiktor正确评论更正)

答案 2 :(得分:2)

这成功了。是否会从更多变的情况下提供可能是一个问题:

gsub("([^ [:digit:].])([[:digit:]])", "\\1~\\2~", chemical)
#[1] "200mL of Ac~2~O~3~, 3.5mml of AgBF~4~, 10.0ml of AgBr, 100ml of AgCl~3~Cu~2~"

逻辑是匹配一个{非数字,非空格,非小数点}字符的配对,后跟一个数字并放置一个波浪形的侧翼数字。如果“数字”的大小可能超过9,那么你可能希望在数字之后加上量化:“[[:digit:]] {1,30}”也许。

答案 3 :(得分:1)

选项是strsplit上的space,然后使用digits替换character开头的单词中的~\\1~

chemical <- "200mL of Ac2O3, 3.5mml of AgBF4, 10.0ml of AgBr, 100ml of AgCl3Cu2"


a <- strsplit(chemical, split = " ")[[1]]

paste0(ifelse(grepl("^[a-zA-Z].*", a),gsub("(\\d)","~\\1~", a),a),collapse = " ")
#[1] "200mL of Ac~2~O~3~, 3.5mml of AgBF~4~, 10.0ml of AgBr, 100ml of AgCl~3~Cu~2~"