我使用正则表达式从13位ISBN中剥离非数字字符,我遇到了一些我想要理解的奇怪行为。我用Python 2.7.5和3.3.2测试了这个:
import re
re.sub("\D", '', '978-1-936978-09-0')
这正确地给出了9781936978090。但我注意到,如果我这样做......
re.sub("\D", '', '978-1-936978-09-0', re.IGNORECASE)
...使用re.IGNORECASE,留下最后两个破折号,给出:9781936978-09-0。
不是它应该重要,但我仔细检查了所有四个破折号是完全相同的字符(只是一个普通的破折号)。我尝试了一些变体(比如[^ \ d]而不是\ D或[^ 0-9])并得到了同样奇怪的结果。
这对我来说并不紧急,因为忽略案例对此并不重要,但我想知道发生了什么。有什么想法吗?
答案 0 :(得分:5)
re.sub
的第四个参数不是flags
,而是替换计数。您应该使用flags
关键字参数指定flags
。
re.sub(pattern, repl, string, count=0, flags=0)
# ^^^^^^^
>>> re.sub("\D", '', '978-1-936978-09-0', flags=re.IGNORECASE)
'9781936978090'
答案 1 :(得分:2)
由于python re
“bug”,re.IGNORECASE
中的re.sub
未被用作标记 - >这是计数
相反,它用于count
参数。
要避免使用此名称参数,它将起作用。
示例:
re.sub("\D", '', '978-1-936978-09-0', re.IGNORECASE)
9781936978-09-0
re.sub("\D", '', '978-1-936978-09-0', flags=re.IGNORECASE)
9781936978090
在python 3.2.0和3.3.0中测试
答案 2 :(得分:1)
您使用了错误的参数re.sub(pattern, repl, string, count=0, flags=0)
。第四是count
。如果在使用re.search
之前使用{{1}}测试正则表达式,那么很容易陷入这个陷阱。