【发布时间】:2020-02-03 01:57:36
【问题描述】:
我一直试图在 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) 一个新行后跟一个特殊字符 仅当它后跟一个空格 (例如 '! but split here',但不是 '!dont split here')。
这是我目前所拥有的:
re.split(u'\n(?=[0-9]|([`\-=~!@#$%^&*()_+\[\]{};\'\\:"|<,./<>?])(?= ))', str)
这已经很接近了,但还没有。这是它产生的输出:
['18 75 19\n!dont split here', '!', '! but split here', '*', '* and split here']
它错误地单独匹配特殊字符:'!'和 '*' 有自己的元素。 正则表达式中有两个前瞻运算符。
如果您能帮助确定我可以使用此正则表达式更改哪些内容以使其不匹配单个特殊字符,而仅匹配特殊字符后跟整行,我将不胜感激。
我也愿意接受其他选择。如果有更好的方法不涉及两次前瞻,我也有兴趣了解解决此问题的其他方法。
谢谢!
【问题讨论】:
-
为什么
'18 75 19\n!dont split here'不应该拆分?在这种情况下,换行符不是跟在数字后面吗?我知道!之后没有空格,但您的第一个条件匹配?:“要么 1)新行后跟数字,要么 2)” -
@Grismar 我认为它应该是“一个新行后跟 一个数字”
-
这会更有意义,尽管示例数据没有这种情况 - 但我同意这会起作用。
-
@Nick 已经提供了一个简洁而正确的答案,只是一个备注:不要使用
str作为变量名,因为它会影响 Python 类型str,这将导致所有各种难以发现的问题。要么使用s之类的东西,或者,如果你坚持使用str,请改用str_。
标签: python regex regex-lookarounds positive-lookahead