annotate Doc/library/difflib.rst @ 58765:2ba7677bfa95 legacy-trunk

testCopysign was defined twice in test_math; combine the definitions
author Mark Dickinson <dickinsm@gmail.com>
date Sat, 06 Feb 2010 23:11:25 +0000
parents 2b3945d755a7
children 713f1f6bf339
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
1 :mod:`difflib` --- Helpers for computing deltas
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
2 ===============================================
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
3
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
4 .. module:: difflib
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
5 :synopsis: Helpers for computing differences between objects.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
6 .. moduleauthor:: Tim Peters <tim_one@users.sourceforge.net>
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
7 .. sectionauthor:: Tim Peters <tim_one@users.sourceforge.net>
44383
3625234bf3d2 Some cleanup in the docs.
Georg Brandl <georg@python.org>
parents: 43753
diff changeset
8 .. Markup by Fred L. Drake, Jr. <fdrake@acm.org>
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
9
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
10 .. testsetup::
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
11
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
12 import sys
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
13 from difflib import *
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
14
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
15 .. versionadded:: 2.1
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
16
43598
96af41e50e56 Added a cross-ref to each other.
Mark Summerfield <list@qtrac.plus.com>
parents: 42604
diff changeset
17 This module provides classes and functions for comparing sequences. It
96af41e50e56 Added a cross-ref to each other.
Mark Summerfield <list@qtrac.plus.com>
parents: 42604
diff changeset
18 can be used for example, for comparing files, and can produce difference
96af41e50e56 Added a cross-ref to each other.
Mark Summerfield <list@qtrac.plus.com>
parents: 42604
diff changeset
19 information in various formats, including HTML and context and unified
96af41e50e56 Added a cross-ref to each other.
Mark Summerfield <list@qtrac.plus.com>
parents: 42604
diff changeset
20 diffs. For comparing directories and files, see also, the :mod:`filecmp` module.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
21
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
22 .. class:: SequenceMatcher
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
23
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
24 This is a flexible class for comparing pairs of sequences of any type, so long
43753
4b3623568e6c Make "hashable" a glossary entry and clarify docs on __cmp__, __eq__ and __hash__.
Georg Brandl <georg@python.org>
parents: 43629
diff changeset
25 as the sequence elements are :term:`hashable`. The basic algorithm predates, and is a
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
26 little fancier than, an algorithm published in the late 1980's by Ratcliff and
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
27 Obershelp under the hyperbolic name "gestalt pattern matching." The idea is to
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
28 find the longest contiguous matching subsequence that contains no "junk"
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
29 elements (the Ratcliff and Obershelp algorithm doesn't address junk). The same
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
30 idea is then applied recursively to the pieces of the sequences to the left and
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
31 to the right of the matching subsequence. This does not yield minimal edit
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
32 sequences, but does tend to yield matches that "look right" to people.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
33
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
34 **Timing:** The basic Ratcliff-Obershelp algorithm is cubic time in the worst
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
35 case and quadratic time in the expected case. :class:`SequenceMatcher` is
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
36 quadratic time for the worst case and has expected-case behavior dependent in a
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
37 complicated way on how many elements the sequences have in common; best case
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
38 time is linear.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
39
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
40
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
41 .. class:: Differ
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
42
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
43 This is a class for comparing sequences of lines of text, and producing
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
44 human-readable differences or deltas. Differ uses :class:`SequenceMatcher`
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
45 both to compare sequences of lines, and to compare sequences of characters
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
46 within similar (near-matching) lines.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
47
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
48 Each line of a :class:`Differ` delta begins with a two-letter code:
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
49
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
50 +----------+-------------------------------------------+
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
51 | Code | Meaning |
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
52 +==========+===========================================+
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
53 | ``'- '`` | line unique to sequence 1 |
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
54 +----------+-------------------------------------------+
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
55 | ``'+ '`` | line unique to sequence 2 |
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
56 +----------+-------------------------------------------+
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
57 | ``' '`` | line common to both sequences |
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
58 +----------+-------------------------------------------+
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
59 | ``'? '`` | line not present in either input sequence |
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
60 +----------+-------------------------------------------+
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
61
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
62 Lines beginning with '``?``' attempt to guide the eye to intraline differences,
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
63 and were not present in either input sequence. These lines can be confusing if
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
64 the sequences contain tab characters.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
65
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
66
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
67 .. class:: HtmlDiff
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
68
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
69 This class can be used to create an HTML table (or a complete HTML file
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
70 containing the table) showing a side by side, line by line comparison of text
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
71 with inter-line and intra-line change highlights. The table can be generated in
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
72 either full or contextual difference mode.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
73
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
74 The constructor for this class is:
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
75
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
76
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
77 .. function:: __init__([tabsize][, wrapcolumn][, linejunk][, charjunk])
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
78
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
79 Initializes instance of :class:`HtmlDiff`.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
80
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
81 *tabsize* is an optional keyword argument to specify tab stop spacing and
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
82 defaults to ``8``.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
83
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
84 *wrapcolumn* is an optional keyword to specify column number where lines are
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
85 broken and wrapped, defaults to ``None`` where lines are not wrapped.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
86
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
87 *linejunk* and *charjunk* are optional keyword arguments passed into ``ndiff()``
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
88 (used by :class:`HtmlDiff` to generate the side by side HTML differences). See
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
89 ``ndiff()`` documentation for argument default values and descriptions.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
90
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
91 The following methods are public:
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
92
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
93
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
94 .. function:: make_file(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
95
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
96 Compares *fromlines* and *tolines* (lists of strings) and returns a string which
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
97 is a complete HTML file containing a table showing line by line differences with
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
98 inter-line and intra-line changes highlighted.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
99
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
100 *fromdesc* and *todesc* are optional keyword arguments to specify from/to file
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
101 column header strings (both default to an empty string).
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
102
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
103 *context* and *numlines* are both optional keyword arguments. Set *context* to
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
104 ``True`` when contextual differences are to be shown, else the default is
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
105 ``False`` to show the full files. *numlines* defaults to ``5``. When *context*
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
106 is ``True`` *numlines* controls the number of context lines which surround the
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
107 difference highlights. When *context* is ``False`` *numlines* controls the
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
108 number of lines which are shown before a difference highlight when using the
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
109 "next" hyperlinks (setting to zero would cause the "next" hyperlinks to place
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
110 the next difference highlight at the top of the browser without any leading
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
111 context).
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
112
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
113
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
114 .. function:: make_table(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
115
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
116 Compares *fromlines* and *tolines* (lists of strings) and returns a string which
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
117 is a complete HTML table showing line by line differences with inter-line and
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
118 intra-line changes highlighted.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
119
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
120 The arguments for this method are the same as those for the :meth:`make_file`
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
121 method.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
122
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
123 :file:`Tools/scripts/diff.py` is a command-line front-end to this class and
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
124 contains a good example of its use.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
125
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
126 .. versionadded:: 2.4
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
127
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
128
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
129 .. function:: context_diff(a, b[, fromfile][, tofile][, fromfiledate][, tofiledate][, n][, lineterm])
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
130
43629
4f662ba09f1f Add :term: for generators.
Georg Brandl <georg@python.org>
parents: 43598
diff changeset
131 Compare *a* and *b* (lists of strings); return a delta (a :term:`generator`
4f662ba09f1f Add :term: for generators.
Georg Brandl <georg@python.org>
parents: 43598
diff changeset
132 generating the delta lines) in context diff format.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
133
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
134 Context diffs are a compact way of showing just the lines that have changed plus
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
135 a few lines of context. The changes are shown in a before/after style. The
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
136 number of context lines is set by *n* which defaults to three.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
137
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
138 By default, the diff control lines (those with ``***`` or ``---``) are created
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
139 with a trailing newline. This is helpful so that inputs created from
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
140 :func:`file.readlines` result in diffs that are suitable for use with
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
141 :func:`file.writelines` since both the inputs and outputs have trailing
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
142 newlines.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
143
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
144 For inputs that do not have trailing newlines, set the *lineterm* argument to
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
145 ``""`` so that the output will be uniformly newline free.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
146
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
147 The context diff format normally has a header for filenames and modification
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
148 times. Any or all of these may be specified using strings for *fromfile*,
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
149 *tofile*, *fromfiledate*, and *tofiledate*. The modification times are normally
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
150 expressed in the format returned by :func:`time.ctime`. If not specified, the
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
151 strings default to blanks.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
152
45454
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
153 >>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
154 >>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
155 >>> for line in context_diff(s1, s2, fromfile='before.py', tofile='after.py'):
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
156 ... sys.stdout.write(line) # doctest: +NORMALIZE_WHITESPACE
45454
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
157 *** before.py
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
158 --- after.py
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
159 ***************
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
160 *** 1,4 ****
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
161 ! bacon
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
162 ! eggs
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
163 ! ham
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
164 guido
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
165 --- 1,4 ----
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
166 ! python
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
167 ! eggy
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
168 ! hamster
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
169 guido
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
170
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
171 See :ref:`difflib-interface` for a more detailed example.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
172
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
173 .. versionadded:: 2.3
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
174
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
175
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
176 .. function:: get_close_matches(word, possibilities[, n][, cutoff])
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
177
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
178 Return a list of the best "good enough" matches. *word* is a sequence for which
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
179 close matches are desired (typically a string), and *possibilities* is a list of
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
180 sequences against which to match *word* (typically a list of strings).
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
181
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
182 Optional argument *n* (default ``3``) is the maximum number of close matches to
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
183 return; *n* must be greater than ``0``.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
184
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
185 Optional argument *cutoff* (default ``0.6``) is a float in the range [0, 1].
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
186 Possibilities that don't score at least that similar to *word* are ignored.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
187
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
188 The best (no more than *n*) matches among the possibilities are returned in a
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
189 list, sorted by similarity score, most similar first.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
190
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
191 >>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
192 ['apple', 'ape']
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
193 >>> import keyword
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
194 >>> get_close_matches('wheel', keyword.kwlist)
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
195 ['while']
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
196 >>> get_close_matches('apple', keyword.kwlist)
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
197 []
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
198 >>> get_close_matches('accept', keyword.kwlist)
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
199 ['except']
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
200
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
201
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
202 .. function:: ndiff(a, b[, linejunk][, charjunk])
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
203
43629
4f662ba09f1f Add :term: for generators.
Georg Brandl <georg@python.org>
parents: 43598
diff changeset
204 Compare *a* and *b* (lists of strings); return a :class:`Differ`\ -style
4f662ba09f1f Add :term: for generators.
Georg Brandl <georg@python.org>
parents: 43598
diff changeset
205 delta (a :term:`generator` generating the delta lines).
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
206
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
207 Optional keyword parameters *linejunk* and *charjunk* are for filter functions
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
208 (or ``None``):
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
209
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
210 *linejunk*: A function that accepts a single string argument, and returns true
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
211 if the string is junk, or false if not. The default is (``None``), starting with
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
212 Python 2.3. Before then, the default was the module-level function
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
213 :func:`IS_LINE_JUNK`, which filters out lines without visible characters, except
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
214 for at most one pound character (``'#'``). As of Python 2.3, the underlying
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
215 :class:`SequenceMatcher` class does a dynamic analysis of which lines are so
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
216 frequent as to constitute noise, and this usually works better than the pre-2.3
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
217 default.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
218
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
219 *charjunk*: A function that accepts a character (a string of length 1), and
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
220 returns if the character is junk, or false if not. The default is module-level
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
221 function :func:`IS_CHARACTER_JUNK`, which filters out whitespace characters (a
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
222 blank or tab; note: bad idea to include newline in this!).
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
223
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
224 :file:`Tools/scripts/ndiff.py` is a command-line front-end to this function.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
225
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
226 >>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1),
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
227 ... 'ore\ntree\nemu\n'.splitlines(1))
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
228 >>> print ''.join(diff),
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
229 - one
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
230 ? ^
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
231 + ore
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
232 ? ^
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
233 - two
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
234 - three
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
235 ? -
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
236 + tree
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
237 + emu
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
238
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
239
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
240 .. function:: restore(sequence, which)
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
241
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
242 Return one of the two sequences that generated a delta.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
243
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
244 Given a *sequence* produced by :meth:`Differ.compare` or :func:`ndiff`, extract
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
245 lines originating from file 1 or 2 (parameter *which*), stripping off line
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
246 prefixes.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
247
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
248 Example:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
249
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
250 >>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1),
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
251 ... 'ore\ntree\nemu\n'.splitlines(1))
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
252 >>> diff = list(diff) # materialize the generated delta into a list
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
253 >>> print ''.join(restore(diff, 1)),
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
254 one
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
255 two
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
256 three
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
257 >>> print ''.join(restore(diff, 2)),
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
258 ore
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
259 tree
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
260 emu
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
261
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
262
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
263 .. function:: unified_diff(a, b[, fromfile][, tofile][, fromfiledate][, tofiledate][, n][, lineterm])
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
264
43629
4f662ba09f1f Add :term: for generators.
Georg Brandl <georg@python.org>
parents: 43598
diff changeset
265 Compare *a* and *b* (lists of strings); return a delta (a :term:`generator`
4f662ba09f1f Add :term: for generators.
Georg Brandl <georg@python.org>
parents: 43598
diff changeset
266 generating the delta lines) in unified diff format.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
267
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
268 Unified diffs are a compact way of showing just the lines that have changed plus
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
269 a few lines of context. The changes are shown in a inline style (instead of
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
270 separate before/after blocks). The number of context lines is set by *n* which
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
271 defaults to three.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
272
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
273 By default, the diff control lines (those with ``---``, ``+++``, or ``@@``) are
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
274 created with a trailing newline. This is helpful so that inputs created from
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
275 :func:`file.readlines` result in diffs that are suitable for use with
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
276 :func:`file.writelines` since both the inputs and outputs have trailing
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
277 newlines.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
278
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
279 For inputs that do not have trailing newlines, set the *lineterm* argument to
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
280 ``""`` so that the output will be uniformly newline free.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
281
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
282 The context diff format normally has a header for filenames and modification
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
283 times. Any or all of these may be specified using strings for *fromfile*,
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
284 *tofile*, *fromfiledate*, and *tofiledate*. The modification times are normally
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
285 expressed in the format returned by :func:`time.ctime`. If not specified, the
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
286 strings default to blanks.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
287
45454
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
288 >>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
289 >>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
290 >>> for line in unified_diff(s1, s2, fromfile='before.py', tofile='after.py'):
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
291 ... sys.stdout.write(line) # doctest: +NORMALIZE_WHITESPACE
45454
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
292 --- before.py
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
293 +++ after.py
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
294 @@ -1,4 +1,4 @@
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
295 -bacon
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
296 -eggs
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
297 -ham
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
298 +python
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
299 +eggy
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
300 +hamster
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
301 guido
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
302
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
303 See :ref:`difflib-interface` for a more detailed example.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
304
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
305 .. versionadded:: 2.3
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
306
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
307
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
308 .. function:: IS_LINE_JUNK(line)
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
309
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
310 Return true for ignorable lines. The line *line* is ignorable if *line* is
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
311 blank or contains a single ``'#'``, otherwise it is not ignorable. Used as a
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
312 default for parameter *linejunk* in :func:`ndiff` before Python 2.3.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
313
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
314
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
315 .. function:: IS_CHARACTER_JUNK(ch)
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
316
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
317 Return true for ignorable characters. The character *ch* is ignorable if *ch*
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
318 is a space or tab, otherwise it is not ignorable. Used as a default for
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
319 parameter *charjunk* in :func:`ndiff`.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
320
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
321
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
322 .. seealso::
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
323
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
324 `Pattern Matching: The Gestalt Approach <http://www.ddj.com/184407970?pgno=5>`_
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
325 Discussion of a similar algorithm by John W. Ratcliff and D. E. Metzener. This
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
326 was published in `Dr. Dobb's Journal <http://www.ddj.com/>`_ in July, 1988.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
327
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
328
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
329 .. _sequence-matcher:
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
330
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
331 SequenceMatcher Objects
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
332 -----------------------
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
333
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
334 The :class:`SequenceMatcher` class has this constructor:
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
335
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
336
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
337 .. class:: SequenceMatcher([isjunk[, a[, b]]])
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
338
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
339 Optional argument *isjunk* must be ``None`` (the default) or a one-argument
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
340 function that takes a sequence element and returns true if and only if the
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
341 element is "junk" and should be ignored. Passing ``None`` for *isjunk* is
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
342 equivalent to passing ``lambda x: 0``; in other words, no elements are ignored.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
343 For example, pass::
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
344
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
345 lambda x: x in " \t"
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
346
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
347 if you're comparing lines as sequences of characters, and don't want to synch up
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
348 on blanks or hard tabs.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
349
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
350 The optional arguments *a* and *b* are sequences to be compared; both default to
43753
4b3623568e6c Make "hashable" a glossary entry and clarify docs on __cmp__, __eq__ and __hash__.
Georg Brandl <georg@python.org>
parents: 43629
diff changeset
351 empty strings. The elements of both sequences must be :term:`hashable`.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
352
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
353 :class:`SequenceMatcher` objects have the following methods:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
354
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
355
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
356 .. method:: set_seqs(a, b)
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
357
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
358 Set the two sequences to be compared.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
359
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
360 :class:`SequenceMatcher` computes and caches detailed information about the
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
361 second sequence, so if you want to compare one sequence against many
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
362 sequences, use :meth:`set_seq2` to set the commonly used sequence once and
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
363 call :meth:`set_seq1` repeatedly, once for each of the other sequences.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
364
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
365
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
366 .. method:: set_seq1(a)
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
367
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
368 Set the first sequence to be compared. The second sequence to be compared
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
369 is not changed.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
370
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
371
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
372 .. method:: set_seq2(b)
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
373
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
374 Set the second sequence to be compared. The first sequence to be compared
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
375 is not changed.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
376
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
377
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
378 .. method:: find_longest_match(alo, ahi, blo, bhi)
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
379
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
380 Find longest matching block in ``a[alo:ahi]`` and ``b[blo:bhi]``.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
381
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
382 If *isjunk* was omitted or ``None``, :meth:`find_longest_match` returns
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
383 ``(i, j, k)`` such that ``a[i:i+k]`` is equal to ``b[j:j+k]``, where ``alo
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
384 <= i <= i+k <= ahi`` and ``blo <= j <= j+k <= bhi``. For all ``(i', j',
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
385 k')`` meeting those conditions, the additional conditions ``k >= k'``, ``i
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
386 <= i'``, and if ``i == i'``, ``j <= j'`` are also met. In other words, of
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
387 all maximal matching blocks, return one that starts earliest in *a*, and
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
388 of all those maximal matching blocks that start earliest in *a*, return
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
389 the one that starts earliest in *b*.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
390
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
391 >>> s = SequenceMatcher(None, " abcd", "abcd abcd")
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
392 >>> s.find_longest_match(0, 5, 0, 9)
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
393 Match(a=0, b=4, size=5)
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
394
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
395 If *isjunk* was provided, first the longest matching block is determined
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
396 as above, but with the additional restriction that no junk element appears
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
397 in the block. Then that block is extended as far as possible by matching
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
398 (only) junk elements on both sides. So the resulting block never matches
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
399 on junk except as identical junk happens to be adjacent to an interesting
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
400 match.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
401
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
402 Here's the same example as before, but considering blanks to be junk. That
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
403 prevents ``' abcd'`` from matching the ``' abcd'`` at the tail end of the
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
404 second sequence directly. Instead only the ``'abcd'`` can match, and
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
405 matches the leftmost ``'abcd'`` in the second sequence:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
406
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
407 >>> s = SequenceMatcher(lambda x: x==" ", " abcd", "abcd abcd")
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
408 >>> s.find_longest_match(0, 5, 0, 9)
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
409 Match(a=1, b=0, size=4)
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
410
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
411 If no blocks match, this returns ``(alo, blo, 0)``.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
412
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
413 .. versionchanged:: 2.6
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
414 This method returns a :term:`named tuple` ``Match(a, b, size)``.
44638
62f6d780a11d Documentation for r5990[3567].
Georg Brandl <georg@python.org>
parents: 44383
diff changeset
415
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
416
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
417 .. method:: get_matching_blocks()
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
418
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
419 Return list of triples describing matching subsequences. Each triple is of
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
420 the form ``(i, j, n)``, and means that ``a[i:i+n] == b[j:j+n]``. The
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
421 triples are monotonically increasing in *i* and *j*.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
422
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
423 The last triple is a dummy, and has the value ``(len(a), len(b), 0)``. It
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
424 is the only triple with ``n == 0``. If ``(i, j, n)`` and ``(i', j', n')``
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
425 are adjacent triples in the list, and the second is not the last triple in
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
426 the list, then ``i+n != i'`` or ``j+n != j'``; in other words, adjacent
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
427 triples always describe non-adjacent equal blocks.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
428
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
429 .. XXX Explain why a dummy is used!
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
430
50522
ee9ced92843a Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
Georg Brandl <georg@python.org>
parents: 46555
diff changeset
431 .. versionchanged:: 2.5
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
432 The guarantee that adjacent triples always describe non-adjacent blocks
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
433 was implemented.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
434
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
435 .. doctest::
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
436
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
437 >>> s = SequenceMatcher(None, "abxcd", "abcd")
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
438 >>> s.get_matching_blocks()
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
439 [Match(a=0, b=0, size=2), Match(a=3, b=2, size=2), Match(a=5, b=4, size=0)]
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
440
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
441
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
442 .. method:: get_opcodes()
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
443
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
444 Return list of 5-tuples describing how to turn *a* into *b*. Each tuple is
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
445 of the form ``(tag, i1, i2, j1, j2)``. The first tuple has ``i1 == j1 ==
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
446 0``, and remaining tuples have *i1* equal to the *i2* from the preceding
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
447 tuple, and, likewise, *j1* equal to the previous *j2*.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
448
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
449 The *tag* values are strings, with these meanings:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
450
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
451 +---------------+---------------------------------------------+
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
452 | Value | Meaning |
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
453 +===============+=============================================+
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
454 | ``'replace'`` | ``a[i1:i2]`` should be replaced by |
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
455 | | ``b[j1:j2]``. |
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
456 +---------------+---------------------------------------------+
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
457 | ``'delete'`` | ``a[i1:i2]`` should be deleted. Note that |
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
458 | | ``j1 == j2`` in this case. |
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
459 +---------------+---------------------------------------------+
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
460 | ``'insert'`` | ``b[j1:j2]`` should be inserted at |
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
461 | | ``a[i1:i1]``. Note that ``i1 == i2`` in |
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
462 | | this case. |
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
463 +---------------+---------------------------------------------+
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
464 | ``'equal'`` | ``a[i1:i2] == b[j1:j2]`` (the sub-sequences |
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
465 | | are equal). |
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
466 +---------------+---------------------------------------------+
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
467
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
468 For example:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
469
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
470 >>> a = "qabxcd"
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
471 >>> b = "abycdf"
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
472 >>> s = SequenceMatcher(None, a, b)
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
473 >>> for tag, i1, i2, j1, j2 in s.get_opcodes():
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
474 ... print ("%7s a[%d:%d] (%s) b[%d:%d] (%s)" %
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
475 ... (tag, i1, i2, a[i1:i2], j1, j2, b[j1:j2]))
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
476 delete a[0:1] (q) b[0:0] ()
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
477 equal a[1:3] (ab) b[0:2] (ab)
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
478 replace a[3:4] (x) b[2:3] (y)
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
479 equal a[4:6] (cd) b[3:5] (cd)
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
480 insert a[6:6] () b[5:6] (f)
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
481
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
482
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
483 .. method:: get_grouped_opcodes([n])
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
484
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
485 Return a :term:`generator` of groups with up to *n* lines of context.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
486
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
487 Starting with the groups returned by :meth:`get_opcodes`, this method
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
488 splits out smaller change clusters and eliminates intervening ranges which
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
489 have no changes.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
490
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
491 The groups are returned in the same format as :meth:`get_opcodes`.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
492
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
493 .. versionadded:: 2.3
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
494
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
495
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
496 .. method:: ratio()
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
497
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
498 Return a measure of the sequences' similarity as a float in the range [0,
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
499 1].
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
500
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
501 Where T is the total number of elements in both sequences, and M is the
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
502 number of matches, this is 2.0\*M / T. Note that this is ``1.0`` if the
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
503 sequences are identical, and ``0.0`` if they have nothing in common.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
504
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
505 This is expensive to compute if :meth:`get_matching_blocks` or
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
506 :meth:`get_opcodes` hasn't already been called, in which case you may want
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
507 to try :meth:`quick_ratio` or :meth:`real_quick_ratio` first to get an
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
508 upper bound.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
509
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
510
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
511 .. method:: quick_ratio()
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
512
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
513 Return an upper bound on :meth:`ratio` relatively quickly.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
514
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
515 This isn't defined beyond that it is an upper bound on :meth:`ratio`, and
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
516 is faster to compute.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
517
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
518
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
519 .. method:: real_quick_ratio()
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
520
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
521 Return an upper bound on :meth:`ratio` very quickly.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
522
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
523 This isn't defined beyond that it is an upper bound on :meth:`ratio`, and
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
524 is faster to compute than either :meth:`ratio` or :meth:`quick_ratio`.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
525
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
526 The three methods that return the ratio of matching to total characters can give
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
527 different results due to differing levels of approximation, although
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
528 :meth:`quick_ratio` and :meth:`real_quick_ratio` are always at least as large as
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
529 :meth:`ratio`:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
530
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
531 >>> s = SequenceMatcher(None, "abcd", "bcde")
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
532 >>> s.ratio()
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
533 0.75
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
534 >>> s.quick_ratio()
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
535 0.75
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
536 >>> s.real_quick_ratio()
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
537 1.0
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
538
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
539
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
540 .. _sequencematcher-examples:
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
541
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
542 SequenceMatcher Examples
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
543 ------------------------
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
544
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
545 This example compares two strings, considering blanks to be "junk:"
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
546
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
547 >>> s = SequenceMatcher(lambda x: x == " ",
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
548 ... "private Thread currentThread;",
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
549 ... "private volatile Thread currentThread;")
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
550
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
551 :meth:`ratio` returns a float in [0, 1], measuring the similarity of the
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
552 sequences. As a rule of thumb, a :meth:`ratio` value over 0.6 means the
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
553 sequences are close matches:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
554
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
555 >>> print round(s.ratio(), 3)
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
556 0.866
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
557
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
558 If you're only interested in where the sequences match,
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
559 :meth:`get_matching_blocks` is handy:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
560
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
561 >>> for block in s.get_matching_blocks():
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
562 ... print "a[%d] and b[%d] match for %d elements" % block
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
563 a[0] and b[0] match for 8 elements
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
564 a[8] and b[17] match for 21 elements
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
565 a[29] and b[38] match for 0 elements
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
566
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
567 Note that the last tuple returned by :meth:`get_matching_blocks` is always a
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
568 dummy, ``(len(a), len(b), 0)``, and this is the only case in which the last
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
569 tuple element (number of elements matched) is ``0``.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
570
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
571 If you want to know how to change the first sequence into the second, use
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
572 :meth:`get_opcodes`:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
573
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
574 >>> for opcode in s.get_opcodes():
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
575 ... print "%6s a[%d:%d] b[%d:%d]" % opcode
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
576 equal a[0:8] b[0:8]
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
577 insert a[8:8] b[8:17]
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
578 equal a[8:29] b[17:38]
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
579
53552
2b3945d755a7 Add example to the seealso section.
Raymond Hettinger <python@rcn.com>
parents: 51745
diff changeset
580 .. seealso::
2b3945d755a7 Add example to the seealso section.
Raymond Hettinger <python@rcn.com>
parents: 51745
diff changeset
581
2b3945d755a7 Add example to the seealso section.
Raymond Hettinger <python@rcn.com>
parents: 51745
diff changeset
582 * The :func:`get_close_matches` function in this module which shows how
2b3945d755a7 Add example to the seealso section.
Raymond Hettinger <python@rcn.com>
parents: 51745
diff changeset
583 simple code building on :class:`SequenceMatcher` can be used to do useful
2b3945d755a7 Add example to the seealso section.
Raymond Hettinger <python@rcn.com>
parents: 51745
diff changeset
584 work.
2b3945d755a7 Add example to the seealso section.
Raymond Hettinger <python@rcn.com>
parents: 51745
diff changeset
585
2b3945d755a7 Add example to the seealso section.
Raymond Hettinger <python@rcn.com>
parents: 51745
diff changeset
586 * `Simple version control recipe
2b3945d755a7 Add example to the seealso section.
Raymond Hettinger <python@rcn.com>
parents: 51745
diff changeset
587 <http://code.activestate.com/recipes/576729/>`_ for a small application
2b3945d755a7 Add example to the seealso section.
Raymond Hettinger <python@rcn.com>
parents: 51745
diff changeset
588 built with :class:`SequenceMatcher`.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
589
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
590
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
591 .. _differ-objects:
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
592
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
593 Differ Objects
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
594 --------------
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
595
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
596 Note that :class:`Differ`\ -generated deltas make no claim to be **minimal**
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
597 diffs. To the contrary, minimal diffs are often counter-intuitive, because they
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
598 synch up anywhere possible, sometimes accidental matches 100 pages apart.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
599 Restricting synch points to contiguous matches preserves some notion of
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
600 locality, at the occasional cost of producing a longer diff.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
601
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
602 The :class:`Differ` class has this constructor:
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
603
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
605 .. class:: Differ([linejunk[, charjunk]])
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
606
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
607 Optional keyword parameters *linejunk* and *charjunk* are for filter functions
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
608 (or ``None``):
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
609
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
610 *linejunk*: A function that accepts a single string argument, and returns true
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
611 if the string is junk. The default is ``None``, meaning that no line is
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
612 considered junk.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
613
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
614 *charjunk*: A function that accepts a single character argument (a string of
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
615 length 1), and returns true if the character is junk. The default is ``None``,
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
616 meaning that no character is considered junk.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
617
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
618 :class:`Differ` objects are used (deltas generated) via a single method:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
619
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
620
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
621 .. method:: Differ.compare(a, b)
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
622
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
623 Compare two sequences of lines, and generate the delta (a sequence of lines).
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
624
46555
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
625 Each sequence must contain individual single-line strings ending with newlines.
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
626 Such sequences can be obtained from the :meth:`readlines` method of file-like
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
627 objects. The delta generated also consists of newline-terminated strings, ready
66c8bd1bedf3 reformat some documentation of classes so methods and attributes are under the class directive
Benjamin Peterson <benjamin@python.org>
parents: 46014
diff changeset
628 to be printed as-is via the :meth:`writelines` method of a file-like object.
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
629
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
630
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
631 .. _differ-examples:
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
632
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
633 Differ Example
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
634 --------------
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
635
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
636 This example compares two texts. First we set up the texts, sequences of
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
637 individual single-line strings ending with newlines (such sequences can also be
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
638 obtained from the :meth:`readlines` method of file-like objects):
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
639
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
640 >>> text1 = ''' 1. Beautiful is better than ugly.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
641 ... 2. Explicit is better than implicit.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
642 ... 3. Simple is better than complex.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
643 ... 4. Complex is better than complicated.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
644 ... '''.splitlines(1)
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
645 >>> len(text1)
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
646 4
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
647 >>> text1[0][-1]
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
648 '\n'
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
649 >>> text2 = ''' 1. Beautiful is better than ugly.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
650 ... 3. Simple is better than complex.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
651 ... 4. Complicated is better than complex.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
652 ... 5. Flat is better than nested.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
653 ... '''.splitlines(1)
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
654
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
655 Next we instantiate a Differ object:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
656
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
657 >>> d = Differ()
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
658
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
659 Note that when instantiating a :class:`Differ` object we may pass functions to
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
660 filter out line and character "junk." See the :meth:`Differ` constructor for
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
661 details.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
662
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
663 Finally, we compare the two:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
664
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
665 >>> result = list(d.compare(text1, text2))
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
666
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
667 ``result`` is a list of strings, so let's pretty-print it:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
668
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
669 >>> from pprint import pprint
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
670 >>> pprint(result)
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
671 [' 1. Beautiful is better than ugly.\n',
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
672 '- 2. Explicit is better than implicit.\n',
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
673 '- 3. Simple is better than complex.\n',
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
674 '+ 3. Simple is better than complex.\n',
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
675 '? ++\n',
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
676 '- 4. Complex is better than complicated.\n',
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
677 '? ^ ---- ^\n',
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
678 '+ 4. Complicated is better than complex.\n',
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
679 '? ++++ ^ ^\n',
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
680 '+ 5. Flat is better than nested.\n']
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
681
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
682 As a single multi-line string it looks like this:
42604
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
683
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
684 >>> import sys
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
685 >>> sys.stdout.writelines(result)
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
686 1. Beautiful is better than ugly.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
687 - 2. Explicit is better than implicit.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
688 - 3. Simple is better than complex.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
689 + 3. Simple is better than complex.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
690 ? ++
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
691 - 4. Complex is better than complicated.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
692 ? ^ ---- ^
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
693 + 4. Complicated is better than complex.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
694 ? ++++ ^ ^
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
695 + 5. Flat is better than nested.
9e1529bf0442 Move the 3k reST doc tree in place.
Georg Brandl <georg@python.org>
parents:
diff changeset
696
45454
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
697
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
698 .. _difflib-interface:
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
699
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
700 A command-line interface to difflib
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
701 -----------------------------------
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
702
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
703 This example shows how to use difflib to create a ``diff``-like utility.
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
704 It is also contained in the Python source distribution, as
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
705 :file:`Tools/scripts/diff.py`.
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
706
46014
31cf38bdaac0 Enable doctest running for several other documents.
Georg Brandl <georg@python.org>
parents: 45454
diff changeset
707 .. testcode::
45454
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
708
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
709 """ Command line interface to difflib.py providing diffs in four formats:
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
710
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
711 * ndiff: lists every line and highlights interline changes.
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
712 * context: highlights clusters of changes in a before/after format.
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
713 * unified: highlights clusters of changes in an inline format.
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
714 * html: generates side by side comparison with change highlights.
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
715
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
716 """
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
717
51745
9815da43a1ce revert r69777 since all the experts agree that extra import lines distract from the code
Benjamin Peterson <benjamin@python.org>
parents: 51742
diff changeset
718 import sys, os, time, difflib, optparse
45454
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
719
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
720 def main():
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
721 # Configure the option parser
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
722 usage = "usage: %prog [options] fromfile tofile"
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
723 parser = optparse.OptionParser(usage)
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
724 parser.add_option("-c", action="store_true", default=False,
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
725 help='Produce a context format diff (default)')
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
726 parser.add_option("-u", action="store_true", default=False,
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
727 help='Produce a unified format diff')
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
728 hlp = 'Produce HTML side by side diff (can use -c and -l in conjunction)'
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
729 parser.add_option("-m", action="store_true", default=False, help=hlp)
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
730 parser.add_option("-n", action="store_true", default=False,
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
731 help='Produce a ndiff format diff')
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
732 parser.add_option("-l", "--lines", type="int", default=3,
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
733 help='Set number of context lines (default 3)')
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
734 (options, args) = parser.parse_args()
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
735
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
736 if len(args) == 0:
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
737 parser.print_help()
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
738 sys.exit(1)
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
739 if len(args) != 2:
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
740 parser.error("need to specify both a fromfile and tofile")
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
741
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
742 n = options.lines
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
743 fromfile, tofile = args # as specified in the usage string
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
744
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
745 # we're passing these as arguments to the diff function
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
746 fromdate = time.ctime(os.stat(fromfile).st_mtime)
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
747 todate = time.ctime(os.stat(tofile).st_mtime)
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
748 fromlines = open(fromfile, 'U').readlines()
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
749 tolines = open(tofile, 'U').readlines()
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
750
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
751 if options.u:
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
752 diff = difflib.unified_diff(fromlines, tolines, fromfile, tofile,
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
753 fromdate, todate, n=n)
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
754 elif options.n:
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
755 diff = difflib.ndiff(fromlines, tolines)
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
756 elif options.m:
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
757 diff = difflib.HtmlDiff().make_file(fromlines, tolines, fromfile,
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
758 tofile, context=options.c,
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
759 numlines=n)
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
760 else:
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
761 diff = difflib.context_diff(fromlines, tolines, fromfile, tofile,
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
762 fromdate, todate, n=n)
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
763
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
764 # we're using writelines because diff is a generator
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
765 sys.stdout.writelines(diff)
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
766
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
767 if __name__ == '__main__':
d7e232e9f1a1 More difflib examples. Written for GHOP by Josip Dzolonga.
Georg Brandl <georg@python.org>
parents: 44638
diff changeset
768 main()