【问题标题】:How to split a string into numbers and characters [duplicate]如何将字符串拆分为数字和字符[重复]
【发布时间】:2021-07-12 11:40:41
【问题描述】:
string = 'Hello, welcome to my world001'

这是我一直试图分成两部分的字符串(数字和字符串)。后面的数字需要从原始字符串中拆分出来。 python中是否有任何方法可以真正快速地做到这一点。

这是我的尝试(代码):

length_of_string = len(string) - 1
num = []
if string[-1].isdigit():
    while length_of_string > 0:
          if string[length_of_string].isdigit():
              num.insert(0, int(string[length_of_string]))
          length_of_string -= 1
      print(num)
else:
    string += '1'
    print(string)

【问题讨论】:

    标签: python string split


    【解决方案1】:

    这里可能适合使用正则表达式查找所有方法。或者,我们可以找到所有非数字或所有数字字符的组。

    string = 'Hello, welcome to my world001'
    parts = re.findall(r'\D+|\d+', string)
    print(parts)  # ['Hello, welcome to my world', '001']
    

    【讨论】:

      【解决方案2】:

      您可以将itertools.groupbystr.isdigit 测试一起用作分组功能

      from itertools import groupby
      
      parts = ["".join(g) for _, g in groupby(string, key=str.isdigit)]
      

      【讨论】:

        【解决方案3】:

        您可以使用正则表达式:

        import re 
        string = 'Hello, welcome to my world001'
        m=re.search(r'^(.*?)(\d+)$', string)
        
        >>> m.groups()
        ('Hello, welcome to my world', '001')
        

        或使用正则表达式拆分:

        >>> re.split(r'(?<=\D)(?=\d+$)', string)
        ['Hello, welcome to my world', '001']
        

        或者,您可以成对循环字符串并在看到第一个数字时中断以执行拆分:

        for i,(c1,c2) in enumerate(zip(string, string[1:]),1):
            if c2.isdigit(): break
        
        s1,s2=(string[0:i],string[i:])
        
        >>> (s1,s2)
        ('Hello, welcome to my world', '001')
        

        【讨论】:

          【解决方案4】:

          不是最快的,但仍然很pythonic:

          def chars_and_nums(text):
              if not text:
                  return iter(), iter()
              return filter(str.isdigit, text), filter(str.isalpha, text)
          

          更高效:

          def chars_and_nums_efficient(text):
              if not text:
                  return [], []
              digits, chars = [], []
              for c in text:
                  if c.isdigit():
                      digits.append(c)
                  elif c.isalpha():
                      chars.append(c)
              return digits, chars
          

          【讨论】:

          • 创造力+1,但你有一个错误。您需要使用例如lambda x: (x.isalpha() or x.isspace()) 或 lambda x: (not x.isdigit()),否​​则会从结果中删除空格。
          • @Dalen 我知道这种行为。不知何故,我认为应该只保留字母和数字。
          【解决方案5】:
          
          string = "Hello world001"
          end = []
          last_change = string[-1].isdigit()
          temp = []
          for x in range(len(string)-1, -1, -1):
              char = string[x]
              changed = char.isdigit()
              if changed==last_change:
                  temp.append(char)
                  continue
              temp.reverse()
              end.append("".join(temp))
              temp = [char]
              last_change = changed
          
          if temp:
              temp.reverse()
              end.append("".join(temp))
          
          end.reverse()
          print(end)
          

          此代码会将您的字符串拆分为字母和数字块,但会组合在一起。我让它通过“字符串”向后走,这样如果您只需要区分最后几位数字和其余数字,您可以在第一次检测到更改后中断循环。 那么你的字符串部分将是:

          string_part = string[:x]
          

          和号码:

          number = end[-1]
          # or "".join(temp) if you do not overwrite it
          

          您可以让它向前遍历字符串并删除所有 .reverse(),也可以丢弃 range() 并使用:

          for char in string: ...
          

          这段代码很快,不用担心,但如果你坚持要更少的代码,那么你可以使用正则表达式来做到这一点。在模块“re”中有 re.split() 函数,类似于普通的 str.split(),但按正则表达式模式拆分,而不是按固定子字符串拆分。但是,出于您的目的,我的代码很可能会更快。 re.split() 在此过程中将不得不做更多的检查。正则表达式是一个很棒的工具,如果您知道如何使用它们,但它们并不总是最快的解决方案。

          我非常喜欢@schwobaseggl 的回答。如果我是你,我会使用 itertools 解决方案。 groupby() 函数的工作原理与我发布的代码基本相同。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-08-19
            • 1970-01-01
            • 2021-12-07
            • 2014-06-24
            • 2021-11-29
            • 2016-12-01
            • 1970-01-01
            相关资源
            最近更新 更多