【问题标题】:Split a string around any characters not specified围绕未指定的任何字符拆分字符串
【发布时间】:2012-11-19 21:30:37
【问题描述】:

我希望能够将字符串拆分成一个列表,围绕任何不是数字或点的内容。目前 split 方法只提供了一种对 split 进行肯定匹配的方法,正则表达式是在这种情况下采用的最佳途径吗?

例如,给定字符串"10.23, 10.13.21; 10.1 10.5 and 10.23.32" 这应该返回列表['10.23', '10.13.21', '10.1', '10.5', '10.23.32']

因此,我相信在这种情况下使用的最佳正则表达式将是...... [\d\.]+

这是处理这种情况的最佳方式吗?

【问题讨论】:

  • 我同意正则表达式似乎最适合这种情况。

标签: python regex string


【解决方案1】:

如果您正在考虑re.findall:您可以将re.split 与您的正则表达式的反转版本一起使用:

In [1]: import re

In [2]: s = "10.23, 10.13.21; 10.1 10.5 and 10.23.32"

In [3]: re.split(r'[^\d\.]+', s)
Out[3]: ['10.23', '10.13.21', '10.1', '10.5', '10.23.32']

【讨论】:

  • 谢谢!这正是我想要的,我不介意使用正则表达式,这只是获取匹配项然后构建我自己的列表的额外复杂性,我想避免这种情况,所以这是完美的。
【解决方案2】:

如果您想要除正则表达式之外的解决方案,您可以使用str.translate 并将除'.0123456789' 之外的所有内容转换为空格并致电split()

In [69]: mystr
Out[69]: '10.23, 10.13.21; 10.1 10.5 and 10.23.32'

In [70]: mystr.translate(' '*46 + '. ' + '0123456789' + ' '*198).split()
Out[70]: ['10.23', '10.13.21', '10.1', '10.5', '10.23.32']

希望对你有帮助

【讨论】:

    【解决方案3】:

    @inspectorG4dget 建议的可读性更好的形式:

    >>> import string
    >>> s = '10.23, 10.13.21; 10.1 10.5 and 10.23.32'
    >>> ''.join(c if c in set(string.digits + '.') else ' ' for c in s).split()
    ['10.23', '10.13.21', '10.1', '10.5', '10.23.32']
    

    这样您可以避免使用正则表达式,这通常是一个好主意,因为您可以很容易地做到这一点。

    【讨论】:

      猜你喜欢
      • 2014-11-12
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 2021-07-05
      相关资源
      最近更新 更多