【问题标题】:Python regex to separate strings which ends with numbers in parenthesisPython正则表达式分隔以括号中的数字结尾的字符串
【发布时间】:2017-03-28 02:23:48
【问题描述】:

我有一个在 beautifulsoup 操作后生成的列表。它有由括号中的数字分隔的字符串,我想将其拆分为内部列表。例如我有

L1=['alpha(1) beta(4)','delta(5) gamma(6)']

这需要转换成

[[‘alpha’, ‘beta’],[‘gamma’, ‘delta’]]

我从这个开始

[re.split(r'\(\d\)',item) for item in L1] 

但这会在最后一项中创建额外的空间,然后在最后生成一个空白项。

[['alpha', ' beta', ''], ['delta', ' gamma', '']]

所以我在这样的代码中再添加一行

L1=[re.split(r'\(\d\)',item) for item in L1]
[[x.strip() for x in y if x] for y in L1]

这给了我想要的

[['alpha', 'beta'], ['delta', 'gamma']]

所以我的查询是

  1. 为什么它只使用命令的第一行来完成它的工作。为什么要创建最后一个元素。
  2. 有没有更好的方法通过单一且更简单的正则表达式来实现这一目标?

【问题讨论】:

    标签: python regex split strip


    【解决方案1】:

    我会使用拆分:

    print([[j.split("(")[0] for j in  i.split()] for i in L1])
    

    返回:

    [['alpha', 'beta'], ['delta', 'gamma']]
    

    【讨论】:

    • 这看起来非常优雅,甚至不用正则表达式。谢谢你
    • 很高兴为您提供帮助!如果这对您来说是正确的解决方案,请将答案标记为正确的解决方案!谢谢
    • 谢谢。我认为下面的问题也回答了我的问题,并为我提供了另一种方法。我已经接受了。虽然在这种情况下发布的所有 4 个解决方案都帮助我学习了一个新命令!
    【解决方案2】:

    根据文档,re.split() 的行为与 str.split() 相同,str.split() 的文档明确声明

    使用指定的分隔符拆分空字符串返回 ['']。

    由于您的分隔符右侧有一个空字符串,因此您的 split() 结果中会出现一个空字符串。我认为为空字符串返回'' 的想法会导致更一致和可预测的行为。

    关于实现代码的更好方法,我认为以下内容更清楚:

    >>> L1=['alpha(1) beta(4)','delta(5) gamma(6)']
    >>> name_list = []
    >>> for s in L1:
        name_list.append(re.findall(r'(\w+)\(\d+\)', s))
    >>> name_list
    [['alpha', 'beta'], ['delta', 'gamma']]
    

    或使用列表推导:

    name_list = [re.findall(r'(\w+)\(\d+\)', s) for s in L1]
    

    【讨论】:

    • 只是来建议这一点 - findall 我认为实现你所追求的东西更具可读性。
    • 您的解释非常有帮助,您建议的 findall 方法也是如此。谢谢!
    【解决方案3】:

    \(\d\) 模式在您的字符串中找到多个不重叠的匹配项,并在这些位置拆分字符串。这意味着它将'alpha(1) beta(4)' 拆分为alpha beta 和一个空字符串,因为最后一个(4) 位于 beta 和字符串结尾之间。

    如果您想使用带有原始re.split 方法的正则表达式,您可以考虑使用filter 删除结果列表中的空项目:

    import re
    L1=['alpha(1) beta(4)','delta(5) gamma(6)']
    res = [filter(None, re.split(r'\(\d+\)\s*', item)) for item in L1]
    print(res)
    # => [['alpha', 'beta'], ['delta', 'gamma']]
    

    请参阅Python demo\(\d+\)\s* 将匹配括号内的数字,\s* 将匹配 0+ 个空格。

    【讨论】:

      【解决方案4】:

      拆分逗号,然后使用正则表达式替换括号和数字。最后用空格分割字符串。

      import re
      >>> [re.sub('\(\d\)', '', y).split() for x in L1 for y in x.split(',')]
      [['alpha', 'beta'], ['delta', 'gamma']]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-25
        • 1970-01-01
        相关资源
        最近更新 更多