Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中第一次出现字母时拆分字符串?_Python_Arrays_Regex_String_Split - Fatal编程技术网

如何在Python中第一次出现字母时拆分字符串?

如何在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 前三个示例的第一个字符串后面应该有一个空格,但这只显示在编辑器中 如何以这种方式拆分字符串? 这里有两篇文章看起来很相关: 第一个问题的

A具有以下格式的一系列字符串。演示示例如下所示:

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']