0

我一直试图在 Python 中找出这个正则表达式,但它没有产生预期的结果。

我有一个我加载的文本文件,格式如下:

"18 75 19\n!dont split here\n! but split here\n* and split here"

我想得到以下输出:

['18 75 19\n!dont split here',
 '! but split here',
 '* and split here']

我正在尝试将我的字符串拆分为 1) 一个新行后跟一个数字,或 2) 一个新行后跟一个特殊字符,前提是它后跟一个空格(例如“!但在此处拆分”,但不是'!不要在这里分裂')。

这是我到目前为止所拥有的:

re.split(u'\n(?=[0-9]|([`\-=~!@#$%^&*()_+\[\]{};\'\\:"|<,./<>?])(?= ))', str)

这很接近,但还没有。这是它产生的输出:

['18 75 19\n!dont split here', '!', '! but split here', '*', '* and split here']

它错误地单独匹配特殊字符:'!' 和 '*' 有自己的元素。正则表达式中有两个前瞻运算符。

如果您能帮助确定我可以使用此正则表达式更改的内容以使其不匹配单个特殊字符,并且只匹配特殊字符后跟整行,我将不胜感激。

我也对替代品持开放态度。如果有更好的方法不涉及两个前瞻,我也有兴趣了解解决此问题的其他方法。

谢谢!

4

1 回答 1

4

您的正则表达式实际上正在工作,问题在于您周围的捕获组[`\-=~!@#$%^&*()_+\[\]{};\'\\:"|<,./<>?]。从手册

如果在模式中使用捕获括号,则模式中所有组的文本也作为结果列表的一部分返回

如果您删除该()字符类的周围,您将获得您期望的结果。

请注意,您不需要(?= )这种交替,因为它已经是前瞻的一部分,您可以使用(space)。此外,您可能会发现将符号编写为否定字符类更容易,即

re.split(u'\n(?=[0-9]|[^A-Za-z0-9] )', str)
于 2020-02-03T02:10:11.120 回答