【问题标题】:separate number from the string将数字与字符串分开
【发布时间】:2019-08-08 04:52:45
【问题描述】:

从字符串中分离出来的数字,但是当连续的'1'时,将它们分开

我认为必须有一个聪明的方法来解决这个问题。

s = 'NNNN1234N11N1N123'

预期结果是:

['1234','1','1','1','123']

【问题讨论】:

标签: python


【解决方案1】:

我认为使用re 模块可以解决您想要的问题

>>> import re
>>> re.findall('(?:1[2-90]+)|1', 'NNNN1234N11N1N123')

编辑:正如 @CrafterKolyan 在 cmets 中所建议的,正则表达式可以简化为 1[2-90]*

输出

['1234', '1', '1', '1', '123']

【讨论】:

  • 谢谢,我不熟悉re,我会研究你的代码,不胜感激,THX。
  • 好吧,看看正则表达式(当然还有re模块),它们非常有用!
  • 是的。我会。我重新编辑了这个问题,忘记了什么,谢谢。
  • 我修正了正则表达式,所以结果如预期。
  • 正则表达式可以更简单1[2-90]*
【解决方案2】:

我也会使用正则表达式(re 模块),但其他函数,即re.split 如下方式:

import re
s = 'NNNN1234N11N1N123'
output = re.split(r'[^\d]+|(?<=1)(?=1)',s)
print(output) # ['', '1234', '1', '1', '1', '123']
output = [i for i in output if i] # jettison empty strs
print(output) # ['1234', '1', '1', '1', '123']

解释:您想拆分 str 以获得 strs 中的 list - 这就是 re.split 的用途。 re.split 的第一个参数用于告诉应该在哪里进行拆分,如果不使用捕获组,将删除所有匹配的内容(类似于 str 方法 split),所以我需要指定两个切割的地方发生了,所以我使用| 替代并通知re.split 进行剪切:

  • [^\d]+ 是 1 个或多个非数字
  • (?&lt;=1)(?=1) 是空的 str 前面是 1 后面是 1,这里我使用了名为零长度断言的特性(两次)

请注意,re.split 在您想要的输出之前生成了''(空的str) - 这意味着第一个剪切(在这种情况下为NNNN)从str 的开头跨越。这是re.split 的预期行为,尽管在这种情况下我们不需要该信息,因此我们可以丢弃任何空的strs,为此我使用了list 理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2018-08-24
    • 2019-10-03
    相关资源
    最近更新 更多