【问题标题】:Python Split String at First Non-Alpha CharacterPython 在第一个非字母字符处拆分字符串
【发布时间】:2022-09-29 04:26:59
【问题描述】:

假设我有诸如\'ABC)D.\'\'AB:CD/\' 之类的字符串。如何在第一个非字母字符处将它们拆分为 [\'ABC\', \'D.\'][\'AB\', \'CD/\']?没有正则表达式有没有办法做到这一点?

  • 您可以使用itertools.takewhile()
  • 另请参阅before_and_after() 配方。
  • 为什么不使用正则表达式?

标签: python string split


【解决方案1】:

您可以使用循环

a = 'AB$FDWRE'
i = 0
while i<len(a) and a[i].isalpha():
    i += 1

>>> a[:i]
'AB'
>>> a[i:]
'$FDWRE'

【讨论】:

  • 使用 for 循环会更加 Pythonic:for i, c in enumerate(a): if not c.isalpha(): break。然后,如果您愿意,很容易添加else 子句来引发ValueError
【解决方案2】:

一种选择是查找第一个非字母字符的位置:

def split_at_non_alpha(s):
    try:
        split_at = next(i for i, x in enumerate(s) if not x.isalpha())
        return s[:split_at], s[split_at+1:]
    except StopIteration: # if not found
        return (s,)

print(split_at_non_alpha('ABC)D.')) # ('ABC', 'D.')
print(split_at_non_alpha('AB:CD/')) # ('AB', 'CD/')
print(split_at_non_alpha('.ABCD')) # ('', 'ABCD')
print(split_at_non_alpha('ABCD.')) # ('ABCD', '')
print(split_at_non_alpha('ABCD')) # ('ABCD',)

【讨论】:

    【解决方案3】:

    Barmar's suggestion 最适合我。其他答案的执行时间几乎相同,但我选择前者是为了便于阅读。

    from itertools import takewhile
    
    str = 'ABC)D.'
    alphStr = ''.join(takewhile(lambda x: x.isalpha(), str))
    
    print(alphStr) # Outputs 'ABC'
    

    【讨论】:

      【解决方案4】:

      使用for loopenumerate 和字符串索引:

      def first_non_alpha_splitter(word):
          for index, char in enumerate(word):
              if not char.isalpha():
                  break
          return [word[:index], word[index+1:]]
      

      结果

      first_non_alpha_splitter('ABC)D.')
      # Output: ['ABC', 'D.']
      
      first_non_alpha_splitter('AB:CD/')
      # Output: ['AB', 'CD/']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-10
        • 2022-01-15
        相关资源
        最近更新 更多