Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.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 使用regex比较两个文档_Python_Regex_Algorithm - Fatal编程技术网

Python 使用regex比较两个文档

Python 使用regex比较两个文档,python,regex,algorithm,Python,Regex,Algorithm,我想比较两个文档,不考虑换行。如果内容相同,但换行符的位置和数量不同,我希望将一个文档中的行映射到另一个文档中的行 鉴于: 文件1 I went to Paris in July 15, where I met some nice people. And I came back to NY in Aug 15. I am planning to go there soon after I finish what I do. 文件2 I went to Paris in July 15, whe

我想比较两个文档,不考虑换行。如果内容相同,但换行符的位置和数量不同,我希望将一个文档中的行映射到另一个文档中的行

鉴于:

文件1

I went to Paris in July 15, where I met some nice people.
And I came back
to NY in Aug 15.
I am planning
to go there soon
after I finish what I do.
文件2

I went
to Paris
in July 15,
where I met
some nice people.
And I came back to NY in Aug 15.
I am planning to go
there soon after I finish what I do.
我需要一种算法,能够确定文档1中的第1行包含与文档2中的第1行到第5行相同的文本,文档1中的第2行和第3行包含与文档2中的第6行相同的文本,等等

1 = 1,2,3,4,5
2,3 = 6
4,5,6 = 7,8

如果正则表达式跨越其他文档中的多行,是否有办法匹配每个文档中的每一行?

您可以遍历doc1的每一行,并执行如下操作:

searchstring=line.replace(“”,[\n]')

然后使用此搜索字符串在doc2上进行搜索

match=re.search(搜索字符串,内容)

如果
match
NULL
,则不存在匹配项。 否则,
match.group(0)
将为您提供文档2的匹配内容

“7月15日我去了巴黎,在那里我遇到了一些好人。”


然后,这是一个简单的练习,通过“\n”将其拆分,并找出它们来自doc2中的哪些行。

我不是python程序员,但这看起来不是一个可以用正则表达式解决的问题

相反,您首先要比较文档以确保内容相同(预先临时删除所有换行符)。如果不是,我不知道你想做什么,所以我不打算解决这个问题

创建名为
linemappings

开始循环。循环将同时遍历每个文档中的每个字符。您将需要四个计数器变量
charindex1
将包含文档1中的当前字符索引,
charindex2
将包含文档2中的当前字符索引
lineindex1
将包含文档1中的当前行索引,
lineindex2
将包含文档2中的当前行索引

首先将char索引变量设置为0,将line索引变量初始化为1

开始循环:

从每个文档中获取当前字符:
char1
来自文档1,而
char2
来自文档2

如果
char1
char2
都是换行符或两者都不是换行符,则将
charindex1
charindex2
向前推进1。
否则,如果
char1
是换行符,则将
charindex1
前进1。
否则,如果
char2
是换行符,则将
charindex2
前进1

如果
char1
char2
是换行符,则在
linemappings
集合中插入一条新记录(最后的结果类似于
[[1,1]、[1,2]、[1,3]、[1,4]、[1,5]、[2,6]、[4,7]、[5,7]、[6,8]

如果
char1
是换行符,则将
lineindex1
前进1。
如果
char2
是换行符,则将
lineindex2
前进1

循环,直到到达输入的末尾

(由于我不是python程序员,所以我无法真正测试这一点,但希望您能了解要点,并能修改它以满足您的需要。)

完整且有效的Java代码。它不是正则表达式解决方案,因此可能不适合您的需要


我们的想法是为每个文档创建一个数组。数组的大小等于每个文档中的行数。数组的第n个元素存储到文档第n行的单词数。然后我们在两个数组中标识这些相等的元素,它们的索引定义了输出的范围。

一种方法是to只需将两个输入拆分为单词,保留它们来自的行,然后将单词逐个对应(假设单词相同)。每个文档中匹配的行如果您没有花足够的时间仔细思考您的问题并正确地解释它,那么您可能没有花足够的时间思考您的问题。我试图澄清您问题的意图。如果我对其进行了破坏,您可以“回滚”感谢@Cyborgx37,可能我需要更多的澄清,我认为你的尝试是一个好的选择one@TerryLi有更好的答案,我个人同意。
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.commons.io.FileUtils;

public class Compare {
    public static void main(String[] args) throws IOException {
        String doc1 = FileUtils.readFileToString(new File("Doc1.txt"));
        String doc2 = FileUtils.readFileToString(new File("Doc2.txt"));
        String[] array1 = doc1.split("\n");
        String[] array2 = doc2.split("\n");
        int[] count1 = new int[array1.length];
        int[] count2 = new int[array2.length];
        int sum1 = 0;
        int sum2 = 0;
        for (int i=0;i<count1.length;i++) {
            count1[i] = sum1 + array1[i].split(" ").length;
            sum1 = count1[i];
        }
        for (int i=0;i<count2.length;i++) {
            count2[i] = sum2 + array2[i].split(" ").length;
            sum2 = count2[i];
        }
        ArrayList<Integer> result1 = new ArrayList<Integer>();
        ArrayList<Integer> result2 = new ArrayList<Integer>();
        for (int j=0; j<count1.length; ) {
            for (int k=0; k<count2.length; ) {
                if (count1[j]==count2[k]) {
                    result1.add(j+1);
                    result2.add(k+1);
                    System.out.println(result1.toString()+" = "+result2.toString());
                    result1 = new ArrayList<Integer>();
                    result2 = new ArrayList<Integer>();
                    j++;k++;
                } else if (count1[j]>count2[k]) {
                    result2.add(k+1);
                    k++;
                } else {
                    result1.add(j+1);
                    j++;
                }
            }
        }
    }
}
[1] = [1, 2, 3, 4, 5]
[2, 3] = [6]
[4, 5, 6] = [7, 8]