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

为什么?

来自 docore.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'