【问题标题】:Strange behavior with Python 3 re.subPython 3 re.sub 的奇怪行为
【发布时间】:2020-08-27 17:11:16
【问题描述】:

以下代码:

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

为什么?

【问题讨论】:

  • re.sub 的第四个参数是计数,而不是标志。应该是re.sub('[^a-zA-Z0-9]', '', ',Inc.',0, re.IGNORECASE)
  • 知道我忘记了一些愚蠢的事情。谢谢!

标签: python python-3.x regex re


【解决方案1】:

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>

你正在传递 flag re.IGNORECASE(如果你是 print(int(re.IGNORECASE)),它的值为 2,尽管我怀疑这在任何地方都没有强制要求)作为 count使用。

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

相反,您应该使用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2022-08-23
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多