【问题标题】:How do I truncate a string at the last letter before the first occurrence of a digit?如何在第一次出现数字之前在最后一个字母处截断字符串?
【发布时间】:2012-07-10 17:53:50
【问题描述】:

我正在尝试在字符串中查找内容 - 所有内容都在数字之前,例如:

"Diablo Lord Of Destruction 9.2"

这是来自文件的索引,例如 file[2] = "Diablo Lord Of Destruction 9.2"

我如何编写代码,只选择文本并忽略数字和这些数字之前的任何空白(如下所示)?

"Diablo Lord Of Destruction"

我知道您可以通过执行以下操作轻松做到这一点:

contents = file[2]
print contents[0:-2]

由于值会发生变化,我需要一个更强大的解决方案来处理不同大小的数字和不同长度的空白。

【问题讨论】:

  • 请澄清您的问题。很难看出他们在问什么。
  • 你听说过正则表达式吗?
  • 1.我有一个列表,我从中选择一个索引。 2. 文件中的索引包含我要删除的数字。 3. 索引始终采用相同的格式“等等等等等等等等#.#.#” 4. 我想采用该索引,一般来说,能够以任何有效的方法删除数字。
  • @AlejandroPiad 听说过?,是的。实际使用、应用和研究过它们吗?没有

标签: python string parsing indexing


【解决方案1】:

这会从您的字符串中删除所有数字和句号:

import re
>>> filtered = re.sub('[0-9.]*','',"Diablo Lord Of Destruction 9.2  111" )
>>> filtered
'Diablo Lord Of Destruction   '
>>> filtered.strip()           # you might want to get rid of the trailing space too!
'Diablo Lord Of Destruction'

【讨论】:

    【解决方案2】:

    您可以使用regular expressionssub() 方法:

    返回替换最左边不重叠得到的字符串 替换 repl 在字符串中出现的模式。如果 未找到模式,字符串原样返回。 repl 可以是 字符串或函数;如果它是一个字符串,任何反斜杠都会在其中转义 正在处理。

    >>> import re
    >>> re.sub('[0-9.]*', '', 'Diablo Lord of Destruction 9.2')[:-1]
    'Diablo Lord of Destruction'
    >>> re.sub('[\d.]*', '', 'Diablo Lord of Destruction 9.2')[:-1]
    'Diablo Lord of Destruction'
    

    上面的代码将查找所有出现的数字,[0-9.] 或 [\d.],并将它们替换为 ''。此外,它会修剪最后一个字符,即空格。

    【讨论】:

    • 非常感谢。这工作得很好,也很容易理解,谢谢你的解释。
    • @Larson 未来的注意事项:我认为你应该尝试学习正则表达式,因为它们对于许多问题来说都是非常有价值的工具,其中比较简单的是这个。所以,既然你已经有了答案,那就去en.wikipedia.org/wiki/Regular_expression 尝试习惯它们吧。你会发现它非常有用。
    【解决方案3】:

    这是正则表达式的完美工作。具体来说,您可以使用以下代码提取数字前面的所有文本:

    import re
    s = "Diablo Lord Of Destruction 9.2"
    print 'Text: ', re.match('([^0-9]+)',s).group(1)
    

    正则表达式很难掌握,但值得努力。

    【讨论】:

    • re.match('([^0-9]+)',"two * 2 = four").group(1)
    • @Rakis 你能解释一下 ^ 在这里是如何工作的吗,我以前从未使用过。
    • @Maria Zverina Op 表示该字符串将始终采用相同的格式“blah blah blah more blah有时#.#.#”
    • @Larson 它在 re 模块的文档中(强烈推荐阅读),但是当用作 [] 中的第一个字符时,它意味着匹配所有除了括号中的内容。
    【解决方案4】:

    如果你总是在数字前有一个空格,你可以split 字符串。例如:

    contents = file[2].split() # Gives a list split by whitespace
    contents.pop() # Dump the number
    finalStr = ' '.join(contents)
    

    从运行测试开始:

    >>> test = "Diablo Lord Of Destruction 9.2"
    >>> contents = test.split()
    >>> contents
    ['Diablo', 'Lord', 'Of', 'Destruction', '9.2']
    >>> contents.pop()
    '9.2'
    >>> finalStr = ' '.join(contents)
    >>> finalStr
    'Diablo Lord Of Destruction
    

    【讨论】:

      【解决方案5】:

      怎么样...

      filter(lambda ch: not ch.isdigit(), "Diablo Lord Of Destruction 9.2")
      

      【讨论】:

      • 不过,这会留下点.
      【解决方案6】:

      在遇到第一个数字之前获取所有文本:

      import re
      
      s = "Diablo Lord Of Destruction 9.2"
      print(re.match(r'\D*', s).group(0))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-11
        相关资源
        最近更新 更多