import re
string = "some text \n\n\nError on the field: more\n text and lines\n\n\nError on the field: some more\n lines \n\n\nError on the field: final lines"
pieces = re.split(r'(Error on the field:)', string, re.IGNORECASE)
pieces
['some text \n\n\n', 'Error on the field:', ' more\n text and lines\n\n\n', 'Error on the field:', ' some more\n lines \n\n\nError on the field: final lines']
pieces2 = re.split(r'(Error on the field:)', pieces[4], re.IGNORECASE)
pieces2
[' some more\n lines \n\n\n', 'Error on the field:', ' final lines']
为什么在'Error on the field:'
的初始分割中没有选择pieces
的第三次分割,但是在分割pieces[4]
时会被选中?
答案 0 :(得分:5)
re.split
的位置参数是:
标志(默认值:无标志)
split(pattern, string, maxsplit=0, flags=0)
您将re.IGNORECASE
(标志的值为2
)作为maxsplit
参数(作为 postional )传递,这解释了奇怪的效果。它可以在某种程度上起作用,然后按照2次分割后的指示停止分割。
只需改为flags=re.IGNORECASE
(关键字,而非位置),然后就可以了。
在re.compile
中,您可以将该标记安全地传递给compile(pattern, flags=0)
,re.match
和re.search
也是如此,但不是re.split
{1}}& re.sub
,所以它很容易陷入陷阱。如有疑问,请始终使用pass-by-keyword作为可选参数。
答案 1 :(得分:2)
使用re.split时,您需要声明使用flags=
明确使用标记:
import re
string = "some text \n\n\nError on the field: more\n text and lines\n\n\nError on the field: some more\n lines \n\n\nError on the field: final lines"
pieces = re.split(r'(Error on the field:)', string, flags=re.I)
print(pieces)
<强>输出:强>
['some text \n\n\n', 'Error on the field:', ' more\n text and lines\n\n\n', 'Error on the field:', ' some more\n lines \n\n\n', 'Error on the field:', ' final lines']
N.B。 re.I
与re.IGNORECASE
相同