【问题标题】:Regular expression split unexpected empty string item正则表达式拆分意外的空字符串项
【发布时间】:2021-05-11 22:48:47
【问题描述】:

我有类似这个例子的字符串

"BODY: 88% RECYCLED POLYESTER, 12% ELASTANE GUSSET LINING: 91% COTTON, 9% ELASTANE EXCLUSIVE OF DECORATION"

我想拆分它们,以便带有冒号的单词开始一个新的列表项,同时保留该冒号单词

["BODY: 77% RECYCLED POLYESTER, 23% ELASTANE", "MESH: 84% POLYAMIDE, 16% ELASTANE EXCLUSIVE OF DECORATION"]

我想出了

re.split("\s(\w+:.+)", p)

但这会在最后返回一个空字符串,我不知道为什么

['BODY: 77% RECYCLED POLYESTER, 23% ELASTANE', 'MESH: 84% POLYAMIDE, 16% ELASTANE EXCLUSIVE OF DECORATION', '']

【问题讨论】:

标签: python regex


【解决方案1】:

您可以使用re.split(r"\s(?=\w+:)", s)。我添加了一个前瞻 ?= 以确保拆分仅发生在具有 \w+: 模式的空格字符上。

最初的尝试将整个模式包含在拆分组中,从而导致不良结果(如果您包含多个 word: 组,您会发现除了尾随的空字符串之外还有更大的问题)。

这是一个比较:

>>> s = "foo: bar bar baz: asdfa sdfasd quux: zzzz"
>>> #                ^                 ^
>>> # we want to split on the highlighted space characters above
>>>
>>> re.split(r"\s(\w+:.+)", s) # incorrect
['foo: bar bar', 'baz: asdfa sdfasd quux: zzzz', '']
>>> re.split(r"\s(?=\w+:)", s) # correct
['foo: bar bar', 'baz: asdfa sdfasd', 'quux: zzzz']

如果要处理多个空格的拆分,可以使用r"\s+(?=\w+:)"

还请注意,所有正则表达式文字都应使用原始字符串,以确保不会无意中转义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2013-11-19
    • 2011-06-18
    相关资源
    最近更新 更多