【问题标题】:Separate number/letter tokens in Python在 Python 中单独的数字/字母标记
【发布时间】:2011-09-25 19:12:19
【问题描述】:

我正在使用re.split() 将字符串分隔为标记。目前我用作参数的模式是[^\dA-Za-z],它从字符串中检索字母数字标记。

但是,我还需要将同时具有数字和字母的标记拆分为只有一个或另一个的标记,例如。

re.split(pattern, "my t0kens")

将返回["my", "t", "0", "kens"]

我猜我可能需要使用前瞻/后瞻,但我不确定这是否真的有必要,或者是否有更好的方法。

【问题讨论】:

    标签: python regex split


    【解决方案1】:
    >>> [x for x in re.split(r'\s+|(\d+)',"my t0kens") if x]
    ['my', 't', '0', 'kens']
    

    通过在模式中使用捕获括号,标记也将被返回。由于您只想保留数字而不是空格,因此我将 \s 留在了括号外,因此返回了 None,然后可以使用简单的循环将其过滤掉。

    【讨论】:

    • 如果只有单个数字要检索,则此方法有效 - 一般情况下可能有多个,如果我的示例误导了您,请见谅。
    • 这很容易解决。答案已更新。当然,kjp 的答案中的解决方案还是比较优雅的。改用它。
    【解决方案2】:

    改用 findall 方法。

    >>> print re.findall ('[^\d ]+', "my t0kens");
    ['my', 't', 'kens']
    >>> print re.findall ('[\d]+', "my t0kens");
    ['0']
    >>>
    

    编辑:Bart 评论中的更好方法。

    >>> print re.findall('[a-zA-Z]+|\\d+', "my t0kens")
    ['my', 't', '0', 'kens']
    >>>
    

    【讨论】:

    • 你可以合并你的两个建议:print re.findall('[a-zA-Z]+|\\d+', "my t0kens"),返回:['my', 't', '0', 'kens']
    • @Bart - 是的,这好多了!
    • 有了 Bart 的编辑,这绝对比我的回答好。 +1
    • 另外,建议对正则表达式使用原始字符串。无需逃避那些斜线。例如r'[a-zA-Z]+|\d+'
    • 感谢@kjp 和@Bart - 编辑后的版本正是我所需要的。
    【解决方案3】:

    应该是一行代码

    re.findall('[a-z]+|[\d]+', 'my t0kens')
    

    【讨论】:

      【解决方案4】:

      不完美,但从下面的列表中删除空间很容易:-)

      re.split('([\d ])', 'my t0kens')
      ['my', ' ', 't', '0', 'kens']
      

      docs: "按出现的模式分割字符串。如果在模式中使用捕获括号,则模式中所有组的文本也作为结果列表的一部分返回。"

      【讨论】:

        猜你喜欢
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 2020-07-08
        • 2016-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多