Python&Java——循环遍历替换字符串中的部分关键词

                             Python&Java——循环遍历替换字符串中的部分关键词

 

附另外一篇博客:Python——循环遍历多个列表实现字符的组合拼接

 

目标:循环遍历替换字符串中的指定关键词。

例子:

[时间]我想喝[城市]的[饮品店]

[时间]: ["今天", "昨天", "明天"],
[城市]: ["重庆", "成都", "北京", "深圳"],
[饮品店]: ["一点点", "奈雪的茶", "喜茶", "蜜雪冰城"]

结果:

今天我想喝重庆的一点点
今天我想喝重庆的奈雪的茶
今天我想喝重庆的喜茶
今天我想喝重庆的蜜雪冰城
今天我想喝成都的一点点
今天我想喝成都的奈雪的茶
今天我想喝成都的喜茶
今天我想喝成都的蜜雪冰城
今天我想喝北京的一点点
今天我想喝北京的奈雪的茶
今天我想喝北京的喜茶
今天我想喝北京的蜜雪冰城
今天我想喝深圳的一点点
今天我想喝深圳的奈雪的茶
今天我想喝深圳的喜茶
今天我想喝深圳的蜜雪冰城
昨天我想喝重庆的一点点
昨天我想喝重庆的奈雪的茶
昨天我想喝重庆的喜茶
昨天我想喝重庆的蜜雪冰城
昨天我想喝成都的一点点
昨天我想喝成都的奈雪的茶
昨天我想喝成都的喜茶
昨天我想喝成都的蜜雪冰城
昨天我想喝北京的一点点
昨天我想喝北京的奈雪的茶
昨天我想喝北京的喜茶
昨天我想喝北京的蜜雪冰城
昨天我想喝深圳的一点点
昨天我想喝深圳的奈雪的茶
昨天我想喝深圳的喜茶
昨天我想喝深圳的蜜雪冰城
明天我想喝重庆的一点点
明天我想喝重庆的奈雪的茶
明天我想喝重庆的喜茶
明天我想喝重庆的蜜雪冰城
明天我想喝成都的一点点
明天我想喝成都的奈雪的茶
明天我想喝成都的喜茶
明天我想喝成都的蜜雪冰城
明天我想喝北京的一点点
明天我想喝北京的奈雪的茶
明天我想喝北京的喜茶
明天我想喝北京的蜜雪冰城
明天我想喝深圳的一点点
明天我想喝深圳的奈雪的茶
明天我想喝深圳的喜茶
明天我想喝深圳的蜜雪冰城

代码:

import re
import itertools


class Regex2List(object):
    def __init__(self, text, data_dict, regex_list):
        self.text = text
        self.data_dict = data_dict
        self.regex_list = regex_list

    def get_list(self, str_list):
        content, data = [], [""]
        for word in str_list:
            if word == "":
                continue
            elif word in list(self.data_dict.keys()):
                data = itertools.product(data, self.data_dict[word])
            else:
                data = itertools.product(data, [word])
        for tmp in data:
            content.append("".join(re.findall(r"[\w\u4e00-\u9fcc]+", str(tmp))))
        return content

    def run(self):
        res_list = []
        data = re.split("|".join(self.regex_list), self.text)
        for tmp in self.get_list(data):
            res_list.append(tmp)
        return res_list


if __name__ == "__main__":
    text = "[时间]我想喝[城市]的[饮品店]"
    data_dict = {
        "时间": ["今天", "昨天", "明天"],
        "城市": ["重庆", "成都", "北京", "深圳"],
        "饮品店": ["一点点", "奈雪的茶", "喜茶", "蜜雪冰城"]
                }
    rl = Regex2List(text, data_dict, regex_list=["\[", "\]"])
    for res in rl.run():
        print(res)

说明:

Java中同样存在类似python中itertools的模块,戳一下:https://github.com/samagra14/itertools_java.

不知道的童鞋赶紧收藏,动手试一试,亲测有效。

 

第一种方案:将待训练遍历的字符列表全部添加到Itertools.java中的product方法中。

public static <T> Iterable<List<T>> product(List<T>... lists) {
        int total = 1;
        int[] max = new int[lists.length];
        for (int i = 0; i < lists.length; i++) {
            max[i] = lists[i].size();
        }
        int[] initProduct = new int[lists.length];
        Arrays.fill(initProduct, 1);
        for (List<T> list :
                lists) {
            total *= list.size();
        }
        int finalTotal = total;
        return () -> new Iterator<List<T>>() {
            int index = -1;
            int[] presentProduct;

            @Override
            public boolean hasNext() {
                index++;
                return index < finalTotal;
            }

            @Override
            public List<T> next() {
                if (index == 0)
                    presentProduct = initProduct;
                else
                    presentProduct = PermutationGenerator.generateNextProduct(presentProduct, max);
                List<T> result = new ArrayList<>();
                for (int i = 0; i < presentProduct.length; i++) {
                    result.add(lists[i].get(presentProduct[i] - 1));
                }
                return result;
            }
        };
    }

测试代码:

package com.alibaba.bot.ner.itertools;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Test;

/**
 * Author      : geekzw
 * File Name   : ItertoolsTest.java
 * Copyright (c) 2020,All Rights Reserved.
 */


public class ItertoolsTest {

    @Test
    public void testProduct() {
        String[] str1 = {"今天", "昨天", "明天"};
        String[] str2 = {"我想喝"};
        String[] str3 = {"重庆", "成都", "北京", "深圳"};
        String[] str4 = {"的"};
        String[] str5 = {"一点点", "奈雪的茶", "喜茶", "蜜雪冰城"};
        for (List<String> products : Itertools.product(Arrays.asList(str1),
                Arrays.asList(str2),
                Arrays.asList(str3),
                Arrays.asList(str4),
                Arrays.asList(str5))) {
            StringBuilder text = new StringBuilder();
            for (String s : products) {
                text.append(s);
            }
            System.out.print(text + "\n");
        }
    }

}

结果:

今天我想喝重庆的一点点
今天我想喝重庆的奈雪的茶
今天我想喝重庆的喜茶
今天我想喝重庆的蜜雪冰城
今天我想喝成都的一点点
今天我想喝成都的奈雪的茶
今天我想喝成都的喜茶
今天我想喝成都的蜜雪冰城
今天我想喝北京的一点点
今天我想喝北京的奈雪的茶
今天我想喝北京的喜茶
今天我想喝北京的蜜雪冰城
今天我想喝深圳的一点点
今天我想喝深圳的奈雪的茶
今天我想喝深圳的喜茶
今天我想喝深圳的蜜雪冰城
昨天我想喝重庆的一点点
昨天我想喝重庆的奈雪的茶
昨天我想喝重庆的喜茶
昨天我想喝重庆的蜜雪冰城
昨天我想喝成都的一点点
昨天我想喝成都的奈雪的茶
昨天我想喝成都的喜茶
昨天我想喝成都的蜜雪冰城
昨天我想喝北京的一点点
昨天我想喝北京的奈雪的茶
昨天我想喝北京的喜茶
昨天我想喝北京的蜜雪冰城
昨天我想喝深圳的一点点
昨天我想喝深圳的奈雪的茶
昨天我想喝深圳的喜茶
昨天我想喝深圳的蜜雪冰城
明天我想喝重庆的一点点
明天我想喝重庆的奈雪的茶
明天我想喝重庆的喜茶
明天我想喝重庆的蜜雪冰城
明天我想喝成都的一点点
明天我想喝成都的奈雪的茶
明天我想喝成都的喜茶
明天我想喝成都的蜜雪冰城
明天我想喝北京的一点点
明天我想喝北京的奈雪的茶
明天我想喝北京的喜茶
明天我想喝北京的蜜雪冰城
明天我想喝深圳的一点点
明天我想喝深圳的奈雪的茶
明天我想喝深圳的喜茶
明天我想喝深圳的蜜雪冰城

 

第二种方案:如果有多个列表,或者事先不知道有多少个字符列表,怎么实现循环遍历呢?此时需要修改Itertools.java中的product方法。修改结果如下:

public static <T> Iterable<List<T>> product(List<List<T>> lists) {
        int total = 1;
        int[] max = new int[lists.size()];
        for (int i = 0; i < lists.size(); i++) {
            max[i] = lists.get(i).size();
        }
        int[] initProduct = new int[lists.size()];
        Arrays.fill(initProduct, 1);
        for (List<T> list :
                lists) {
            total *= list.size();
        }
        int finalTotal = total;
        return () -> new Iterator<List<T>>() {
            int index = -1;
            int[] presentProduct;

            @Override
            public boolean hasNext() {
                index++;
                return index < finalTotal;
            }

            @Override
            public List<T> next() {
                if (index == 0)
                    presentProduct = initProduct;
                else
                    presentProduct = PermutationGenerator.generateNextProduct(presentProduct, max);
                List<T> result = new ArrayList<>();
                for (int i = 0; i < presentProduct.length; i++) {
                    result.add(lists.get(i).get(presentProduct[i] - 1));
                }
                return result;
            }
        };
    }

测试代码:

package com.alibaba.bot.ner.itertools;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Test;

/**
 * Author      : geekzw
 * File Name   : ItertoolsTest.java
 * Copyright (c) 2020,All Rights Reserved.
 */


public class ItertoolsTest {


    @Test
    public void testProduct() {
        String[] str1 = {"今天", "昨天", "明天"};
        String[] str2 = {"我想喝"};
        String[] str3 = {"重庆", "成都", "北京", "深圳"};
        String[] str4 = {"的"};
        String[] str5 = {"一点点", "奈雪的茶", "喜茶", "蜜雪冰城"};

        List<List<String>> array = new ArrayList<>();
        array.add(Arrays.asList(str1));
        array.add(Arrays.asList(str2));
        array.add(Arrays.asList(str3));
        array.add(Arrays.asList(str4));
        array.add(Arrays.asList(str5));

        for (List<String> products : Itertools.product(array)){
            StringBuilder text = new StringBuilder();
            for (String s : products) {
                text.append(s);
            }
            System.out.print(text + "\n");
        }
    }

}

结果同上。

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页