re.sub只替换前两个实例

时间:2014-11-19 20:20:05

标签: python regex string replace

我在re.sub:

中找到了这个有趣的问题
import re

s = "This: is: a: string:"
print re.sub(r'\:', r'_', s, re.IGNORECASE) 

>>>> This_ is_ a: string:

注意如何只替换前两个实例。似乎为标志添加[implicit]参数名称可以解决问题。

import re

s = "This: is: a: string:"
print re.sub(r'\:', r'_', s, flags=re.IGNORECASE) 

>>>> This_ is_ a_ string_

我想知道是否有人可以解释它或者它实际上是一个错误。

我之前遇到过这个问题,缺少参数名string,但从来没有flags和字符串它通常会爆炸。

1 个答案:

答案 0 :(得分:7)

re.sub的第四个参数不是flags而是count

>>> import re
>>> help(re.sub)
Help on function sub in module re:

sub(pattern, repl, string, count=0, flags=0)
    Return the string obtained by replacing the leftmost
    non-overlapping occurrences of the pattern in string by the
    replacement repl.  repl can be either a string or a callable;
    if a string, backslash escapes in it are processed.  If it is
    a callable, it's passed the match object and must return
    a replacement string to be used.

>>>

这意味着您需要明确地将flags=re.IGNORECASE或其他re.IGNORECASE视为count的参数。

此外,re.IGNORECASE标志等于2

>>> re.IGNORECASE
2
>>>

因此,通过在第一个示例中执行count=re.IGNORECASE,您告诉re.sub仅替换字符串中2次出现的: