Python: how to substitute and know whether it matched
I know that re.sub(pattern, repl,text)
can substitute when pattern matches, and then return the substitute.
My code is:
text = re.sub(pattern, repl, text1)
I have to define another variable to check whether it is modified:
text2 = re.sub(pa开发者_开发知识库ttern, repl, text1)
matches = text2 != text1
text1 = text2
It has issues, for example with: text1='abc123def'
, pattern = '(123|456)'
, repl = '123'
.
After replacement, it is the same string, so matches
is false, but it actually matches.
Use re.subn
Perform the same operation as sub(), but return a tuple (new_string, number_of_subs_made).
and then check the number of replacements that were made. For example:
text2, numReplacements = re.subn(pattern, repl, text1)
if numReplacements:
# did match
else:
# did not match
The repl
parameter can also be a function which takes an RE match object and returns what the replacement should be; this function is not called if the text doesn't match. You could use that to do what you needed then just return a constant string you want to replace it with. This would cut down on an unneeded second check against the RE.
"Whether string contains numbers":
for text1 in ('abc123def', 'adsafasdfafdsafqw', 'fsadfoi81we'):
print("Text %s %s numbers." %
((text1, ) + (
('does not contain',) if not any(c.isdigit() for c in text1)
else ('contains',))
))
精彩评论