如何在Python中第一次出现字母时拆分字符串?
A具有以下格式的一系列字符串。演示示例如下所示:如何在Python中第一次出现字母时拆分字符串?,python,arrays,regex,string,split,Python,Arrays,Regex,String,Split,A具有以下格式的一系列字符串。演示示例如下所示: 71 1*abwhf 8 askg *14 snbsb 00ab 我正在尝试编写一个Python3程序,它将使用for循环遍历每个字符串,并在第一次出现字母时将其拆分为一个包含两个元素的列表 上述字符串的输出将成为包含以下元素的列表: 71 1*和abwhf 8和askg *14和snbsb 00和ab 前三个示例的第一个字符串后面应该有一个空格,但这只显示在编辑器中 如何以这种方式拆分字符串? 这里有两篇文章看起来很相关: 第一个问题的
71 1*abwhf
8 askg
*14 snbsb
00ab
我正在尝试编写一个Python3程序,它将使用for循环遍历每个字符串,并在第一次出现字母时将其拆分为一个包含两个元素的列表
上述字符串的输出将成为包含以下元素的列表:
71 1*
和abwhf
8
和askg
*14
和snbsb
00
和ab
前三个示例的第一个字符串后面应该有一个空格,但这只显示在编辑器中
如何以这种方式拆分字符串?
这里有两篇文章看起来很相关:
第二个字母可以让我在第一个字母处分开,但不能只分开一次。使用此函数将生成包含许多元素的数组。我能想到的唯一方法是自己编写函数:
import string
def split_letters(old_string):
index = -1
for i, char in enumerate(old_string):
if char in string.letters:
index = i
break
else:
raise ValueError("No letters found") # or return old_string
return [old_string[:index], old_string[index:]]
使用
重新搜索
:
import re
strs = ["71 1 * abwhf", "8 askg", "*14 snbsb", "00ab"]
def split_on_letter(s):
match = re.compile("[^\W\d]").search(s)
return [s[:match.start()], s[match.start():]]
for s in strs:
print split_on_letter(s)
regex[^\W\d]
匹配所有字母字符
\W
匹配所有非字母数字字符,\d
匹配所有数字字符^
在集合的开头,将选择反转,以匹配与所有字母对应的非字母数字或数字的所有内容
match
搜索字符串以查找匹配表达式第一次出现的索引。您可以根据匹配的位置对原始字符串进行切片,以获得两个列表。使用re.split()
产生:
'71 1 * ' 'abwhf'
'8 ' 'askg'
'*14 ' 'snbsb'
'00' 'ab'
这里的诀窍是我们在任何一封信上分开,但只要求一次分开。通过将模式放在括号中,我们保存了通常会丢失的拆分字符。然后,我们将拆分字符添加回第二个字符串的前面
sample1 = '71 1 * abwhf'
sample2 = '8 askg'
sample3 = '*14 snbsb'
sample4 = '00ab'
sample5 = '1234'
def split_at_first_letter(txt):
for value in txt:
if value.isalpha():
result = txt.split(value, 1)
return [result[0], '{}{}'.format(value, result[1], )]
return [txt]
print(split_at_first_letter(sample1))
print(split_at_first_letter(sample2))
print(split_at_first_letter(sample3))
print(split_at_first_letter(sample4))
print(split_at_first_letter(sample5))
结果
['71 1 * ', 'abwhf']
['8 ', 'askg']
['*14 ', 'snbsb']
['00', 'ab']
['1234']
谢谢你的回答。这个很整洁。运行它时,我收到一个异常:
AttributeError:module'string'没有属性'letters'
Sorry;我通常用Python2编写代码。在Python3中,它被重命名为ascii\u字母
。如果您希望在其中任何一种情况下都能使用,请使用string.lowercase+string.uppercase
。这非常有效。对于Python3,需要在print
函数周围添加括号。感谢您的回答。return
语句中的代码是如何工作的?前一行中的拆分将删除第二个列表项的第一个字符,为了替换该字符,将从拆分的第一个元素(索引0)和拆分的字符加上拆分的第二个元素(索引1)一起格式化创建一个新列表。
['71 1 * ', 'abwhf']
['8 ', 'askg']
['*14 ', 'snbsb']
['00', 'ab']
['1234']