Python 3 re.sub 的奇怪行为
Strange behavior with Python 3 re.sub
以下代码:
import re
print(re.sub('[^a-zA-Z0-9]', '', ',Inc.', re.IGNORECASE).lower())
print(re.sub('[^a-zA-Z0-9]', '', ', Inc.', re.IGNORECASE).lower())
产生:
inc
inc.
https://repl.it/repls/RightThankfulMaintenance
为什么?
来自 doco,re.sub
签名是:
re.sub(pattern, repl, string, count=0, flags=0)
那么,让我们基于此检查您的调用:
re.sub('[^a-zA-Z0-9]', '' , ', Inc.', re.IGNORECASE) # default
# < pattern > <repl> <string> < count > <flags>
您正在传递 标志 re.IGNORECASE
(如果您 print(int(re.IGNORECASE))
,它的值为 2
,但我怀疑这在任何地方都没有强制要求) 作为要使用的 count。
所以它最多只进行两次替换,即第二个示例开头的逗号和 space 。 也在你的第一个例子中这样做了,只是只有一个字符匹配而不是三个,所以你没有注意到。
相反,您应该使用:
>>> re.sub('[^a-zA-Z0-9]', '', ', Inc.', flags=re.IGNORECASE).lower()
'inc'
以下代码:
import re
print(re.sub('[^a-zA-Z0-9]', '', ',Inc.', re.IGNORECASE).lower())
print(re.sub('[^a-zA-Z0-9]', '', ', Inc.', re.IGNORECASE).lower())
产生:
inc
inc.
https://repl.it/repls/RightThankfulMaintenance
为什么?
来自 doco,re.sub
签名是:
re.sub(pattern, repl, string, count=0, flags=0)
那么,让我们基于此检查您的调用:
re.sub('[^a-zA-Z0-9]', '' , ', Inc.', re.IGNORECASE) # default
# < pattern > <repl> <string> < count > <flags>
您正在传递 标志 re.IGNORECASE
(如果您 print(int(re.IGNORECASE))
,它的值为 2
,但我怀疑这在任何地方都没有强制要求) 作为要使用的 count。
所以它最多只进行两次替换,即第二个示例开头的逗号和 space 。 也在你的第一个例子中这样做了,只是只有一个字符匹配而不是三个,所以你没有注意到。
相反,您应该使用:
>>> re.sub('[^a-zA-Z0-9]', '', ', Inc.', flags=re.IGNORECASE).lower()
'inc'