【发布时间】:2022-09-29 04:26:59
【问题描述】:
假设我有诸如\'ABC)D.\' 或\'AB:CD/\' 之类的字符串。如何在第一个非字母字符处将它们拆分为 [\'ABC\', \'D.\'] 和 [\'AB\', \'CD/\']?没有正则表达式有没有办法做到这一点?
-
另请参阅
before_and_after()配方。 -
为什么不使用正则表达式?
假设我有诸如\'ABC)D.\' 或\'AB:CD/\' 之类的字符串。如何在第一个非字母字符处将它们拆分为 [\'ABC\', \'D.\'] 和 [\'AB\', \'CD/\']?没有正则表达式有没有办法做到这一点?
before_and_after() 配方。
您可以使用循环
a = 'AB$FDWRE'
i = 0
while i<len(a) and a[i].isalpha():
i += 1
>>> a[:i]
'AB'
>>> a[i:]
'$FDWRE'
【讨论】:
for i, c in enumerate(a): if not c.isalpha(): break。然后,如果您愿意,很容易添加else 子句来引发ValueError。
一种选择是查找第一个非字母字符的位置:
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',)
【讨论】:
Barmar's suggestion 最适合我。其他答案的执行时间几乎相同,但我选择前者是为了便于阅读。
from itertools import takewhile
str = 'ABC)D.'
alphStr = ''.join(takewhile(lambda x: x.isalpha(), str))
print(alphStr) # Outputs 'ABC'
【讨论】:
使用for loop、enumerate 和字符串索引:
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/']
【讨论】: