首页 > 解决方案 > 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

为什么?

标签: pythonpython-3.xregexre

解决方案


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(它具有2if you的值print(int(re.IGNORECASE)),尽管我怀疑在任何地方都没有强制要求)作为要使用的计数

因此,它最多只能进行两次替换,即第二个示例中开头的逗号和空格。在您的第一个示例中也是如此,只是只有一个字符匹配而不是三个,所以您没有注意到。

相反,您应该使用:

>>> re.sub('[^a-zA-Z0-9]', '', ', Inc.', flags=re.IGNORECASE).lower()
'inc'

推荐阅读