【问题标题】:Python's re.split() not removing all matched charactersPython re.split() 没有删除所有匹配的字符
【发布时间】:2018-09-10 00:47:16
【问题描述】:

这简直让我发疯。我很肯定字符串开头的整个日期范围都与正则表达式匹配。然而,当我做 re.split 时,8 挂在后面。这里发生了什么,如何在该日期范围内拆分(在某些情况下,它可能位于字符串的开头和中间,因此拆分)?

import re
a = "09/05/2018-12/18/2018 Lecture Wednesday 01:30PM - 02:45PM, Room to be Announced"
b = r"([0-9]|\/|-){21}"
print re.split(b, a)

结果

['', '8', ' Lecture Wednesday 01:30PM - 02:45PM, Room to be Announced']

【问题讨论】:

  • 通过使用lookbehind尝试类似的操作:(?<=[\d/-]{21})\s+您当前的正则表达式将最后一个匹配8捕获为拆分序列。 Test your regex eg here.
  • 当我这样做时可以工作[0-9\/\-]{21}
  • @bobblebubble 应该可以,但是看后面比较慢
  • @Cfreak 你说得对,这很慢。

标签: python regex string parsing


【解决方案1】:

来自re.split 的文档:

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

你确实有一个捕获组,它最后匹配的是字符8。这就是返回 8 的原因。

您可以改用非捕获组:

>>> b = r"(?:[0-9]|\/|-){21}"
           ^^ note these two characters added
>>> re.split(b, a)
['', ' Lecture Wednesday 01:30PM - 02:45PM, Room to be Announced']

或者您可以将所有选项放在一个字符类中,而根本不需要一个组:

>>> b = r"[-/0-9]{21}"
>>> re.split(b, a)
['', ' Lecture Wednesday 01:30PM - 02:45PM, Room to be Announced']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2014-06-02
    • 2016-01-02
    相关资源
    最近更新 更多