I’m trying to diff two strings to determine whether or not they solely vary in one numerical subset of the string structure; for example,
varies_in_single_number_field('foo7bar', 'foo123bar') # Returns True, because 7 != 123, and there's only one varying # number region between the two strings.
In Python I can use the difflib to accomplish this:
import difflib, doctest def varies_in_single_number_field(str1, str2): ''' A typical use case is as follows: >>> varies_in_single_number_field('foo7bar00', 'foo123bar00') True Numerical variation in two dimensions is no good: >>> varies_in_single_number_field('foo7bar00', 'foo123bar01') False Varying in a nonexistent field is okay: >>> varies_in_single_number_field('foobar00', 'foo123bar00') True Identical strings don't *vary* in any number field: >>> varies_in_single_number_field('foobar00', 'foobar00') False ''' in_differing_substring = False passed_differing_substring = False # There should be only one. differ = difflib.Differ() for letter_diff in differ.compare(str1, str2): letter = letter_diff[2:] if letter_diff.startswith(('-', '+')): if passed_differing_substring: # Already saw a varying field. return False in_differing_substring = True if not letter.isdigit(): return False # Non-digit diff character. elif in_differing_substring: # Diff character not found - end of diff. in_differing_substring = False passed_differing_substring = True return passed_differing_substring # No variation if no diff was passed. if __name__ == '__main__': doctest.testmod()
But I have no idea how to find something like difflib for C++. Alternative approaches welcome. 🙂
This might work, it at least passes your demonstration test: EDIT: I’ve made some modifications to deal with some string indexing issues. I believe it should be good now.
Basically, it looks for a string which has 3 parts, string2 begins with part1, string2 ends with part3 and part2 is only digits.