Python unicode正则表达式不适用于大字符串

Python unicode正则表达式不适用于大字符串,python,regex,string,unicode,Python,Regex,String,Unicode,出于某种原因,在相当大的unicode字符串上使用re.sub时,函数只查找并替换匹配的前半部分,而忽略第二部分。 但是,当我减小字符串的大小(删除前半部分)时,它工作正常。 当我在ASCII字符串上测试时,它也可以正常工作 有人能帮我解决这个问题吗 代码: 结果: !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная

出于某种原因,在相当大的unicode字符串上使用re.sub时,函数只查找并替换匹配的前半部分,而忽略第二部分。 但是,当我减小字符串的大小(删除前半部分)时,它工作正常。 当我在ASCII字符串上测试时,它也可以正常工作

有人能帮我解决这个问题吗

代码:

结果:

!Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка.
如您所见,字符串的最后一部分未被处理

更新:
正如RomanPerekhrest在下面所发现的,当我们添加其他标志(如re.MULTILINE、re.VERBOSE等)时,函数会替换字符串中稍大的部分,但仍然没有满。

的函数签名在标志之前有一个计数:

re.sub(pattern, repl, string, count=0, flags=0)
您看到的行为是因为您需要使用
标志
作为关键字参数,否则作为
sub
的第四位置位置参数,这被视为计数。(谢谢JF塞巴斯蒂安,去投他的票)

易于演示:

>>> re.sub(r'\d', '1', '0'*50, re.UNICODE)
'11111111111111111111111111111111000000000000000000'
>>> re.sub(r'\d', '1', '0'*50, re.M)
'11111111000000000000000000000000000000000000000000'
re.M
的值为8,因此仅进行8次替换。更正错误:

>>> re.sub(r'\d', '1', '0'*50, flags=re.M)
'11111111111111111111111111111111111111111111111111'

旁注:

PyPi支持更健壮的Unicode逻辑

例如,如果要修改任何大写字母,可以使用元字符
\p{Lu}

>>> s=u"Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка."
>>> import regex
>>> print regex.sub(ur"(\p{Lu})", ur"!\1", s)
!Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка.

删除
re.UNICODE
,它就可以正常工作了。不过,Python3和Python2中的字节字符串都没有问题。。。这是unicode层上的Python 2错误吗?这是代码中的错误。
>>> s=u"Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка. Очень Длинная Строка."
>>> import regex
>>> print regex.sub(ur"(\p{Lu})", ur"!\1", s)
!Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка. !Очень !Длинная !Строка.