Python so sánh hai tệp theo từng ký tự

Mô-đun này cung cấp các lớp và chức năng để so sánh trình tự. Ví dụ, nó có thể được sử dụng để so sánh các tệp và có thể tạo thông tin về sự khác biệt của tệp ở các định dạng khác nhau, bao gồm HTML và ngữ cảnh và các khác biệt thống nhất. Để so sánh các thư mục và tệp, xem thêm, mô-đun

lớp diflib. trình so khớp trình tự

Đây là một lớp linh hoạt để so sánh các cặp trình tự thuộc bất kỳ loại nào, miễn là các phần tử của trình tự là. Thuật toán cơ bản có trước, và hơi lạ mắt hơn một chút so với thuật toán được Ratcliff và Obershelp xuất bản vào cuối những năm 1980 dưới cái tên hyperbolic “khớp mẫu cử chỉ”. ” Ý tưởng là tìm dãy con khớp liền kề dài nhất không chứa phần tử “rác”; . (Xử lý rác là một phần mở rộng của thuật toán Ratcliff và Obershelp. ) Ý tưởng tương tự sau đó được áp dụng đệ quy cho các phần của chuỗi bên trái và bên phải của chuỗi con phù hợp. Điều này không mang lại trình tự chỉnh sửa tối thiểu, nhưng có xu hướng mang lại kết quả phù hợp “có vẻ phù hợp” với mọi người

thời gian. Thuật toán Ratcliff-Obershelp cơ bản là thời gian bậc ba trong trường hợp xấu nhất và thời gian bậc hai trong trường hợp dự kiến. là thời gian bậc hai đối với trường hợp xấu nhất và có hành vi trong trường hợp dự kiến ​​phụ thuộc một cách phức tạp vào số lượng phần tử chung của các chuỗi;

Heuristic rác tự động. hỗ trợ một heuristic tự động coi các mục trình tự nhất định là rác. Heuristic đếm số lần mỗi mục riêng lẻ xuất hiện trong chuỗi. Nếu các mục trùng lặp (sau mục đầu tiên) chiếm hơn 1% chuỗi và chuỗi dài ít nhất 200 mục, thì mục này được đánh dấu là "phổ biến" và được coi là rác cho mục đích đối sánh trình tự. Có thể tắt phương pháp phỏng đoán này bằng cách đặt đối số

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> print(''.join(diff), end="")
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu
6 thành
>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> print(''.join(diff), end="")
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu
7 khi tạo

Mới trong phiên bản 3. 2. Tham số autojunk.

lớp difflib. khác biệt

Đây là một lớp để so sánh trình tự của các dòng văn bản và tạo ra sự khác biệt hoặc vùng đồng bằng mà con người có thể đọc được. Differ sử dụng cả hai để so sánh trình tự các dòng và để so sánh trình tự các ký tự trong các dòng tương tự (gần giống nhau)

Mỗi dòng của một vùng đồng bằng bắt đầu bằng một mã gồm hai chữ cái

Mã số

Nghĩa

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
1

dòng duy nhất cho chuỗi 1

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
2

dòng duy nhất cho chuỗi 2

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
3

đường chung cho cả hai dãy

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
4

dòng không có trong một trong hai chuỗi đầu vào

Các dòng bắt đầu bằng '

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
5' cố gắng hướng mắt đến sự khác biệt giữa các dòng và không xuất hiện trong cả hai chuỗi đầu vào. Các dòng này có thể gây nhầm lẫn nếu các chuỗi chứa các ký tự tab

lớp diflib. HtmlDiff

Lớp này có thể được sử dụng để tạo một bảng HTML (hoặc một tệp HTML hoàn chỉnh chứa bảng) hiển thị so sánh cạnh nhau, từng dòng của văn bản với các điểm nổi bật thay đổi giữa các dòng và nội dòng. Bảng có thể được tạo ở chế độ khác biệt đầy đủ hoặc theo ngữ cảnh

Hàm tạo của lớp này là

__init__(kích thước tab=8 , cột bọc=Không có , rác dòng=Không có , charjunk=IS_CHARACTER_JUNK)

Khởi tạo thể hiện của

tabsize là một đối số từ khóa tùy chọn để chỉ định khoảng cách dừng tab và mặc định là

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
7

cột quấn là một từ khóa tùy chọn để chỉ định số cột nơi các dòng bị ngắt và được ngắt dòng, mặc định là

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
8 nơi các dòng không được ngắt dòng

linejunk và charjunk là các đối số từ khóa tùy chọn được truyền vào (được sử dụng để tạo sự khác biệt HTML song song). Xem tài liệu về các giá trị và mô tả mặc định của đối số

Các phương pháp sau đây là công khai

make_file(fromlines , tolines , fromdesc='' , todesc='' , bối cảnh=Sai , numlines=5 , * , bộ ký tự='utf-8')

So sánh fromlines và tolines (danh sách các chuỗi) và trả về một chuỗi là tệp HTML hoàn chỉnh chứa bảng hiển thị sự khác biệt giữa các dòng với các thay đổi giữa các dòng và trong dòng được tô sáng

fromdesc và todesc là các đối số từ khóa tùy chọn để chỉ định chuỗi tiêu đề cột từ/đến tệp (cả hai đều mặc định là chuỗi trống)

bối cảnh và numlines đều là đối số từ khóa tùy chọn. Đặt ngữ cảnh thành

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py'))
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido
2 khi hiển thị sự khác biệt theo ngữ cảnh, nếu không, hãy đặt mặc định là
>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> print(''.join(diff), end="")
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu
7 để hiển thị toàn bộ tệp. numlines mặc định là
>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py'))
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido
4. Khi ngữ cảnh là
>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py'))
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido
2, các dòng chữ số kiểm soát số lượng dòng ngữ cảnh bao quanh các điểm nổi bật khác biệt. Khi ngữ cảnh là
>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> print(''.join(diff), end="")
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu
7, các dòng chữ số kiểm soát số lượng dòng được hiển thị trước phần tô sáng khác biệt khi sử dụng các siêu liên kết “tiếp theo” (đặt thành 0 sẽ khiến các siêu liên kết “tiếp theo” đặt phần tô sáng khác biệt tiếp theo ở đầu trình duyệt mà không có bất kỳ phần đầu nào

Ghi chú

fromdesc và todesc được hiểu là HTML chưa thoát và phải được thoát đúng cách khi nhận đầu vào từ các nguồn không đáng tin cậy

Đã thay đổi trong phiên bản 3. 5. đối số chỉ từ khóa bộ ký tự đã được thêm vào. Bộ ký tự mặc định của tài liệu HTML đã thay đổi từ

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py'))
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido
7 thành
>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py'))
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido
8.

make_table(fromlines , tolines , fromdesc='' , todesc='' , bối cảnh=Sai , numlines=5)

So sánh fromlines và tolines (danh sách các chuỗi) và trả về một chuỗi là một bảng HTML hoàn chỉnh hiển thị sự khác biệt giữa các dòng với các thay đổi giữa các dòng và trong dòng được tô sáng

Các đối số của phương thức này cũng giống như đối số của phương thức

lambda x: x in " \t"
0 là giao diện người dùng dòng lệnh cho lớp này và chứa một ví dụ điển hình về việc sử dụng nó

diflib. context_diff(a , b , từ tệp='' , tofile='' , ngày nộp hồ sơ='' , tofiledate='' , n=3 , lineterm='\n')

So sánh a và b (danh sách các chuỗi);

Sự khác biệt ngữ cảnh là một cách nhỏ gọn để chỉ hiển thị các dòng đã thay đổi cộng với một vài dòng ngữ cảnh. Các thay đổi được hiển thị theo kiểu trước/sau. Số lượng dòng ngữ cảnh được đặt theo n, mặc định là ba

Theo mặc định, các dòng điều khiển khác (những dòng có

lambda x: x in " \t"
1 hoặc
lambda x: x in " \t"
2) được tạo bằng một dòng mới ở cuối. Điều này hữu ích để các đầu vào được tạo từ kết quả có khác biệt phù hợp để sử dụng vì cả đầu vào và đầu ra đều có các dòng mới ở cuối

Đối với các đầu vào không có dòng mới ở cuối, hãy đặt đối số thuật ngữ dòng thành

lambda x: x in " \t"
5 để đầu ra sẽ không có dòng mới đồng nhất

Định dạng khác biệt ngữ cảnh thường có tiêu đề cho tên tệp và thời gian sửa đổi. Bất kỳ hoặc tất cả những thứ này có thể được chỉ định bằng cách sử dụng các chuỗi cho fromfile, tofile, fromfiledate và tofiledate. Thời gian sửa đổi thường được thể hiện ở định dạng ISO 8601. Nếu không được chỉ định, các chuỗi mặc định để trống

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(context_diff(s1, s2, fromfile='before.py', tofile='after.py'))
*** before.py
--- after.py
***************
*** 1,4 ****
! bacon
! eggs
! ham
  guido
--- 1,4 ----
! python
! eggy
! hamster
  guido

Xem ví dụ chi tiết hơn

diflib. get_close_matches(từ , khả năng , n=3 , cắt=0. 6)

Trả về danh sách các trận đấu "đủ tốt" tốt nhất. từ là một chuỗi mà các kết quả khớp gần được mong muốn (thường là một chuỗi) và các khả năng là một danh sách các chuỗi để so khớp từ (thường là một danh sách các chuỗi)

Đối số tùy chọn n (mặc định

lambda x: x in " \t"
6) là số lần khớp gần tối đa để trả về;

Ngắt đối số tùy chọn (mặc định

lambda x: x in " \t"
8) là một số float trong phạm vi [0, 1]. Các khả năng không đạt điểm tối thiểu tương tự như từ sẽ bị bỏ qua

Các kết quả phù hợp nhất (không quá n) trong số các khả năng được trả về trong một danh sách, được sắp xếp theo điểm tương đồng, tương tự nhất trước

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']

difflib. ndiff(a , b , rác dòng=Không có , charjunk=IS_CHARACTER_JUNK)

So sánh a và b (danh sách các chuỗi);

Tham số từ khóa tùy chọn linejunk và charjunk là chức năng lọc (hoặc

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
8)

rác rưởi. Một hàm chấp nhận một đối số chuỗi đơn và trả về true nếu chuỗi là rác hoặc sai nếu không. Mặc định là

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
8. Ngoài ra còn có một chức năng cấp mô-đun, lọc ra các dòng không có ký tự hiển thị, ngoại trừ tối đa một ký tự pound (
>>> s = SequenceMatcher(None, " abcd", "abcd abcd")
>>> s.find_longest_match(0, 5, 0, 9)
Match(a=0, b=4, size=5)
3) – tuy nhiên, lớp bên dưới thực hiện phân tích động về những dòng nào thường xuyên tạo thành nhiễu và điều này thường

đồ bỏ đi. Một hàm chấp nhận một ký tự (chuỗi có độ dài 1) và trả về nếu ký tự đó là rác hoặc sai nếu không. Giá trị mặc định là hàm cấp mô-đun , lọc ra các ký tự khoảng trắng (trống hoặc tab; bạn không nên thêm dòng mới vào phần này. )

>>> s = SequenceMatcher(None, " abcd", "abcd abcd")
>>> s.find_longest_match(0, 5, 0, 9)
Match(a=0, b=4, size=5)
6 là giao diện người dùng dòng lệnh cho chức năng này

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> print(''.join(diff), end="")
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu

diflib. khôi phục(trình tự , )

Trả về một trong hai chuỗi đã tạo ra một đồng bằng

Đưa ra một chuỗi được tạo bởi hoặc , trích xuất các dòng bắt nguồn từ tệp 1 hoặc 2 (tham số trong đó), loại bỏ các tiền tố của dòng

Thí dụ

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu

difflib. unified_diff(a , b , từ tệp='' , tofile='' , ngày nộp hồ sơ='' , tofiledate='' , n=3 , lineterm='\n')

So sánh a và b (danh sách các chuỗi);

Khác biệt thống nhất là một cách nhỏ gọn để chỉ hiển thị các dòng đã thay đổi cộng với một vài dòng ngữ cảnh. Các thay đổi được hiển thị theo kiểu nội tuyến (thay vì các khối trước/sau riêng biệt). Số lượng dòng ngữ cảnh được đặt theo n, mặc định là ba

Theo mặc định, các dòng điều khiển khác biệt (những dòng có

lambda x: x in " \t"
2,
>>> s = SequenceMatcher(lambda x: x==" ", " abcd", "abcd abcd")
>>> s.find_longest_match(0, 5, 0, 9)
Match(a=1, b=0, size=4)
0 hoặc
>>> s = SequenceMatcher(lambda x: x==" ", " abcd", "abcd abcd")
>>> s.find_longest_match(0, 5, 0, 9)
Match(a=1, b=0, size=4)
1) được tạo bằng một dòng mới ở cuối. Điều này hữu ích để các đầu vào được tạo từ kết quả có khác biệt phù hợp để sử dụng vì cả đầu vào và đầu ra đều có các dòng mới ở cuối

Đối với các đầu vào không có dòng mới ở cuối, hãy đặt đối số thuật ngữ dòng thành

lambda x: x in " \t"
5 để đầu ra sẽ không có dòng mới đồng nhất

Định dạng khác biệt ngữ cảnh thường có tiêu đề cho tên tệp và thời gian sửa đổi. Bất kỳ hoặc tất cả những thứ này có thể được chỉ định bằng cách sử dụng các chuỗi cho fromfile, tofile, fromfiledate và tofiledate. Thời gian sửa đổi thường được thể hiện ở định dạng ISO 8601. Nếu không được chỉ định, các chuỗi mặc định để trống

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py'))
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido

Xem ví dụ chi tiết hơn

diflib. diff_byte(dfunc , a , b , fromfile=b'' , tofile=b'' , ngày nộp hồ sơ=b'' , tofiledate=b'' , n=3 , lineterm=b'\n')

So sánh a và b (danh sách các đối tượng byte) bằng dfunc; . dfunc phải có thể gọi được, thường là hoặc

Cho phép bạn so sánh dữ liệu với mã hóa không xác định hoặc không nhất quán. Tất cả các đầu vào ngoại trừ n phải là đối tượng byte, không phải str. Hoạt động bằng cách chuyển đổi dễ dàng tất cả các đầu vào (ngoại trừ n) thành str và gọi

>>> s = SequenceMatcher(lambda x: x==" ", " abcd", "abcd abcd")
>>> s.find_longest_match(0, 5, 0, 9)
Match(a=1, b=0, size=4)
7. Đầu ra của dfunc sau đó được chuyển đổi trở lại thành byte, do đó, các dòng delta mà bạn nhận được có cùng mã hóa không xác định/không nhất quán như a và b

Mới trong phiên bản 3. 5

diflib. IS_LINE_JUNK(dòng)

Trả lại

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py'))
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido
2 cho các dòng không thể hiểu được. Dòng có thể bỏ qua nếu dòng trống hoặc chứa một
>>> s = SequenceMatcher(None, " abcd", "abcd abcd")
>>> s.find_longest_match(0, 5, 0, 9)
Match(a=0, b=4, size=5)
3 duy nhất, nếu không thì không thể bỏ qua. Được sử dụng làm mặc định cho tham số linejunk trong các phiên bản cũ hơn

difflib. IS_CHARACTER_JUNK(ch)

Trả lại

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py'))
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido
2 cho các ký tự không thể hiểu được. Ký tự ch có thể bỏ qua nếu ch là dấu cách hoặc tab, nếu không thì không thể bỏ qua. Được sử dụng làm mặc định cho tham số charjunk trong

Xem thêm

Khớp mẫu. Phương pháp tiếp cận Gestalt

Thảo luận về một thuật toán tương tự của John W. Ratcliff và D. e. metzener. Điều này đã được xuất bản trong Tiến sĩ. Tạp chí của Dobb vào tháng 7 năm 1988

Đối tượng SequenceMatcher

Lớp có hàm tạo này

lớp difflib. SequenceMatcher(isjunk=Không có, a='', b='', autojunk=True)

Đối số tùy chọn isjunk phải là

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
8 (mặc định) hoặc hàm một đối số lấy phần tử chuỗi và trả về true khi và chỉ khi phần tử đó là "rác" và nên được bỏ qua. Vượt qua
>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
8 đối với isjunk tương đương với việc vượt qua
>>> s = SequenceMatcher(None, "abxcd", "abcd")
>>> s.get_matching_blocks()
[Match(a=0, b=0, size=2), Match(a=3, b=2, size=2), Match(a=5, b=4, size=0)]
6; . Ví dụ, vượt qua

lambda x: x in " \t"

nếu bạn đang so sánh các dòng dưới dạng chuỗi ký tự và không muốn đồng bộ hóa trên các tab trống hoặc cứng

Các đối số tùy chọn a và b là các trình tự được so sánh; . Các phần tử của cả hai chuỗi phải là

Đối số tùy chọn autojunk có thể được sử dụng để vô hiệu hóa heuristic rác tự động

Mới trong phiên bản 3. 2. Tham số autojunk.

Các đối tượng SequenceMatcher nhận ba thuộc tính dữ liệu. bjunk là tập hợp các phần tử của b mà isjunk là

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py'))
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido
2; . Cả ba đều được đặt lại bất cứ khi nào b được đặt lại bằng hoặc

Mới trong phiên bản 3. 2. Các thuộc tính bjunk và bphổ biến.

các đối tượng có các phương thức sau

set_seqs(a , b)

Đặt hai trình tự được so sánh

tính toán và lưu trữ thông tin chi tiết về chuỗi thứ hai, vì vậy nếu bạn muốn so sánh một chuỗi với nhiều chuỗi, hãy sử dụng để đặt chuỗi thường được sử dụng một lần và gọi lặp lại, một lần cho mỗi chuỗi khác

set_seq1(a)

Đặt trình tự đầu tiên được so sánh. Chuỗi thứ hai được so sánh không bị thay đổi

set_seq2(b)

Đặt trình tự thứ hai được so sánh. Chuỗi đầu tiên được so sánh không bị thay đổi

find_longest_match(alo=0, ahi=None, blo=0, bhi=None)

Tìm khối phù hợp dài nhất trong

>>> a = "qabxcd"
>>> b = "abycdf"
>>> s = SequenceMatcher(None, a, b)
>>> for tag, i1, i2, j1, j2 in s.get_opcodes():
..     print('{:7}   a[{}:{}] --> b[{}:{}] {!r:>8} --> {!r}'.format(
..         tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2]))
delete    a[0:1] --> b[0:0]      'q' --> ''
equal     a[1:3] --> b[0:2]     'ab' --> 'ab'
replace   a[3:4] --> b[2:3]      'x' --> 'y'
equal     a[4:6] --> b[3:5]     'cd' --> 'cd'
insert    a[6:6] --> b[5:6]       '' --> 'f'
4 và
>>> a = "qabxcd"
>>> b = "abycdf"
>>> s = SequenceMatcher(None, a, b)
>>> for tag, i1, i2, j1, j2 in s.get_opcodes():
..     print('{:7}   a[{}:{}] --> b[{}:{}] {!r:>8} --> {!r}'.format(
..         tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2]))
delete    a[0:1] --> b[0:0]      'q' --> ''
equal     a[1:3] --> b[0:2]     'ab' --> 'ab'
replace   a[3:4] --> b[2:3]      'x' --> 'y'
equal     a[4:6] --> b[3:5]     'cd' --> 'cd'
insert    a[6:6] --> b[5:6]       '' --> 'f'
5

Nếu isjunk bị bỏ qua hoặc

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
8, trả về
>>> a = "qabxcd"
>>> b = "abycdf"
>>> s = SequenceMatcher(None, a, b)
>>> for tag, i1, i2, j1, j2 in s.get_opcodes():
..     print('{:7}   a[{}:{}] --> b[{}:{}] {!r:>8} --> {!r}'.format(
..         tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2]))
delete    a[0:1] --> b[0:0]      'q' --> ''
equal     a[1:3] --> b[0:2]     'ab' --> 'ab'
replace   a[3:4] --> b[2:3]      'x' --> 'y'
equal     a[4:6] --> b[3:5]     'cd' --> 'cd'
insert    a[6:6] --> b[5:6]       '' --> 'f'
8 sao cho
>>> a = "qabxcd"
>>> b = "abycdf"
>>> s = SequenceMatcher(None, a, b)
>>> for tag, i1, i2, j1, j2 in s.get_opcodes():
..     print('{:7}   a[{}:{}] --> b[{}:{}] {!r:>8} --> {!r}'.format(
..         tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2]))
delete    a[0:1] --> b[0:0]      'q' --> ''
equal     a[1:3] --> b[0:2]     'ab' --> 'ab'
replace   a[3:4] --> b[2:3]      'x' --> 'y'
equal     a[4:6] --> b[3:5]     'cd' --> 'cd'
insert    a[6:6] --> b[5:6]       '' --> 'f'
9 bằng với
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
00, trong đó
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
01 và
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
02. Đối với tất cả các
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
03 đáp ứng các điều kiện đó, các điều kiện bổ sung
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
04,
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
05 và nếu
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
06,
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
07 cũng được đáp ứng. Nói cách khác, trong số tất cả các khối khớp tối đa, hãy trả về khối bắt đầu sớm nhất trong a và trong số tất cả các khối khớp tối đa bắt đầu sớm nhất trong a, hãy trả về khối bắt đầu sớm nhất trong b

>>> s = SequenceMatcher(None, " abcd", "abcd abcd")
>>> s.find_longest_match(0, 5, 0, 9)
Match(a=0, b=4, size=5)

Nếu isjunk được cung cấp, trước tiên, khối phù hợp dài nhất được xác định như trên, nhưng với hạn chế bổ sung là không có phần tử rác nào xuất hiện trong khối. Sau đó, khối đó được mở rộng hết mức có thể bằng cách khớp (chỉ) các phần tử rác ở cả hai bên. Vì vậy, khối kết quả không bao giờ khớp với rác trừ khi rác giống hệt nhau xảy ra liền kề với một trận đấu thú vị

Đây là ví dụ tương tự như trước, nhưng coi khoảng trống là rác. Điều đó ngăn cản

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
08 khớp trực tiếp với
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
08 ở phần cuối của chuỗi thứ hai. Thay vào đó, chỉ có
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
10 có thể khớp và khớp với
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
10 ngoài cùng bên trái trong chuỗi thứ hai

>>> s = SequenceMatcher(lambda x: x==" ", " abcd", "abcd abcd")
>>> s.find_longest_match(0, 5, 0, 9)
Match(a=1, b=0, size=4)

Nếu không có khối nào khớp, điều này sẽ trả về

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
12

Phương thức này trả về một

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
13

Đã thay đổi trong phiên bản 3. 9. Đã thêm đối số mặc định.

get_matching_blocks()

Trả về danh sách các bộ ba mô tả các chuỗi con phù hợp không chồng chéo. Mỗi bộ ba có dạng

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
14, và có nghĩa là
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
15. Bộ ba đang tăng đơn điệu trong i và j

Bộ ba cuối cùng là một hình nộm và có giá trị

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
16. Nó là bộ ba duy nhất có
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
17. Nếu
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
14 và
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
19 là bộ ba liền kề trong danh sách và bộ thứ hai không phải là bộ ba cuối cùng trong danh sách, thì
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
20 hoặc
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
21;

>>> s = SequenceMatcher(None, "abxcd", "abcd")
>>> s.get_matching_blocks()
[Match(a=0, b=0, size=2), Match(a=3, b=2, size=2), Match(a=5, b=4, size=0)]

get_opcodes()

Trả về danh sách gồm 5 bộ mô tả cách biến a thành b. Mỗi bộ có dạng

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
22. Bộ đầu tiên có
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
23 và các bộ còn lại có i1 bằng i2 từ bộ trước đó và tương tự như vậy, j1 bằng j2 trước đó

Các giá trị thẻ là các chuỗi, với các ý nghĩa này

Giá trị

Nghĩa

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
24

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
25 nên được thay thế bằng
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
26

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
27

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
25 nên bị xóa. Lưu ý rằng
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
29 trong trường hợp này

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
30

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
26 nên được chèn vào
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
32. Lưu ý rằng
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
33 trong trường hợp này

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
34

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
35 (dãy con bằng nhau)

Ví dụ

>>> a = "qabxcd"
>>> b = "abycdf"
>>> s = SequenceMatcher(None, a, b)
>>> for tag, i1, i2, j1, j2 in s.get_opcodes():
..     print('{:7}   a[{}:{}] --> b[{}:{}] {!r:>8} --> {!r}'.format(
..         tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2]))
delete    a[0:1] --> b[0:0]      'q' --> ''
equal     a[1:3] --> b[0:2]     'ab' --> 'ab'
replace   a[3:4] --> b[2:3]      'x' --> 'y'
equal     a[4:6] --> b[3:5]     'cd' --> 'cd'
insert    a[6:6] --> b[5:6]       '' --> 'f'

get_grouped_opcodes(n=3)

Trả về một nhóm có tối đa n dòng ngữ cảnh

Bắt đầu với các nhóm được trả về bởi , phương pháp này phân tách các cụm thay đổi nhỏ hơn và loại bỏ các phạm vi xen kẽ không có thay đổi

Các nhóm được trả về ở cùng định dạng như

tỷ lệ()

Trả về thước đo độ tương tự của các chuỗi dưới dạng float trong phạm vi [0, 1]

Trong đó T là tổng số phần tử trong cả hai dãy và M là số trận đấu, đây là 2. 0*M/T. Lưu ý rằng đây là

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
38 nếu các trình tự giống hệt nhau và
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
39 nếu chúng không có điểm chung

Điều này rất tốn kém để tính toán nếu hoặc chưa được gọi, trong trường hợp đó, bạn có thể muốn thử hoặc trước tiên để có giới hạn trên

Ghi chú

thận trọng. Kết quả của một cuộc gọi có thể phụ thuộc vào thứ tự của các đối số. Ví dụ

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
0

quick_ratio()

Trả lại một giới hạn trên tương đối nhanh chóng

real_quick_ratio()

Trả lại giới hạn trên rất nhanh

Ba phương thức trả về tỷ lệ khớp với tổng số ký tự có thể cho kết quả khác nhau do mức độ gần đúng khác nhau, mặc dù

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
42 và
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
43 luôn lớn ít nhất bằng
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
44

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
1

Các ví dụ về SequenceMatcher

Ví dụ này so sánh hai chuỗi, coi các khoảng trống là "rác"

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
2

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
44 trả về một số float trong [0, 1], đo lường mức độ giống nhau của các chuỗi. Theo quy tắc chung, giá trị
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
44 trên 0. 6 có nghĩa là các trình tự là kết hợp chặt chẽ

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
3

Nếu bạn chỉ quan tâm đến việc các trình tự khớp với nhau ở đâu, thì

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
40 rất hữu ích

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
4

Lưu ý rằng bộ cuối cùng được trả về bởi

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
40 luôn là một biến giả,
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
16 và đây là trường hợp duy nhất trong đó phần tử của bộ cuối cùng (số phần tử khớp) là
lambda x: x in " \t"
7

Nếu bạn muốn biết cách thay đổi dãy thứ nhất thành dãy thứ hai, hãy sử dụng

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
36

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
5

Xem thêm

  • Chức năng trong mô-đun này cho biết cách sử dụng cách xây dựng mã đơn giản để thực hiện công việc hữu ích

  • Công thức kiểm soát phiên bản đơn giản cho một ứng dụng nhỏ được xây dựng với

đối tượng khác nhau

Lưu ý rằng -generated deltas không có tuyên bố là khác biệt tối thiểu. Ngược lại, sự khác biệt tối thiểu thường phản trực giác, bởi vì chúng đồng bộ hóa bất cứ nơi nào có thể, đôi khi trùng khớp ngẫu nhiên cách nhau 100 trang. Việc hạn chế các điểm đồng bộ đối với các trận đấu liền kề sẽ bảo tồn một số khái niệm về địa phương, với chi phí không thường xuyên là tạo ra sự khác biệt dài hơn.

Lớp có hàm tạo này

lớp difflib. Khác nhau(rác dòng=Không có, charjunk=None)

Tham số từ khóa tùy chọn linejunk và charjunk dành cho chức năng lọc (hoặc

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
8)

rác rưởi. Một hàm chấp nhận một đối số chuỗi đơn và trả về true nếu chuỗi đó là rác. Giá trị mặc định là

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
8, nghĩa là không có dòng nào bị coi là rác

đồ bỏ đi. Một hàm chấp nhận một đối số ký tự đơn (chuỗi có độ dài 1) và trả về true nếu ký tự đó là rác. Giá trị mặc định là

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print(''.join(restore(diff, 1)), end="")
one
two
three
>>> print(''.join(restore(diff, 2)), end="")
ore
tree
emu
8, nghĩa là không có ký tự nào được coi là rác

Các chức năng lọc rác này tăng tốc độ đối sánh để tìm sự khác biệt và không làm cho bất kỳ dòng hoặc ký tự khác nhau nào bị bỏ qua. Đọc mô tả về tham số isjunk của phương thức để được giải thích

các đối tượng được sử dụng (deltas được tạo) thông qua một phương thức duy nhất

so sánh(a , b)

So sánh hai chuỗi dòng và tạo delta (một chuỗi các dòng)

Mỗi chuỗi phải chứa các chuỗi một dòng riêng lẻ kết thúc bằng dòng mới. Các chuỗi như vậy có thể được lấy từ phương thức của các đối tượng giống như tệp. Đồng bằng được tạo cũng bao gồm các chuỗi kết thúc dòng mới, sẵn sàng để được in nguyên trạng thông qua phương thức của một đối tượng giống như tệp

Ví dụ khác

Ví dụ này so sánh hai văn bản. Đầu tiên, chúng tôi thiết lập các văn bản, trình tự của các chuỗi một dòng riêng lẻ kết thúc bằng dòng mới (các trình tự như vậy cũng có thể được lấy từ phương thức

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
67 của các đối tượng giống như tệp)

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
6

Tiếp theo chúng ta khởi tạo một đối tượng Differ

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
7

Lưu ý rằng khi khởi tạo một đối tượng, chúng ta có thể truyền các hàm để lọc ra dòng và ký tự “rác”. ” Xem nhà xây dựng để biết chi tiết

Cuối cùng, chúng tôi so sánh hai

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
8

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
72 là một danh sách các chuỗi, vì vậy hãy in nó thật đẹp

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
9

Là một chuỗi nhiều dòng duy nhất, nó trông như thế này

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
..              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> print(''.join(diff), end="")
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu
0

Giao diện dòng lệnh cho difflib

Ví dụ này cho thấy cách sử dụng difflib để tạo một tiện ích giống như

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
73. Nó cũng được chứa trong bản phân phối nguồn Python, như
lambda x: x in " \t"
0

Làm cách nào để so sánh hai ký tự trong Python?

Bạn có thể so sánh các chuỗi trong Python bằng cách sử dụng đẳng thức ( == ) và phép so sánh ( < , > ,. = , . Không có phương pháp đặc biệt nào để so sánh hai chuỗi.

Làm cách nào để so sánh hai tệp văn bản?

Cách so sánh văn bản tài liệu bằng Windows 10 .
Trong hộp tìm kiếm trên thanh công cụ, gõ Word. .
Chọn Word từ các tùy chọn tìm kiếm. .
Trên thanh công cụ MS Word, nhấp vào Xem lại. .
Trong menu Đánh giá, nhấp vào So sánh. .
Từ hai tùy chọn có sẵn, chọn So sánh…