A具有以下格式的一系列字符串。演示示例如下所示:
71 1 * abwhf
8 askg
*14 snbsb
00ab
我正在尝试编写一个Python 3程序,该程序将使用 for 循环遍历每个字符串,并在第一次出现字母时将其拆分为一个包含两个元素的列表。
上述字符串的输出将成为包含以下元素的列表:
71 1 *
和abwhf
8
和askg
*14
和snbsb
00
和ab
假设是前三个示例中第一个字符串之后的空格,但这仅在编辑器中显示
如何以这种方式拆分字符串?
这两个帖子看起来很相似:
第一个问题的第一个答案允许我在第一次出现单个字符时分割字符串,但不能分割多个字符(就像字母表中的所有字母一样)。
第二个允许我分开第一个字母,但不只是一次。使用它会产生一个包含许多元素的数组。
答案 0 :(得分:2)
我能想到的唯一方法就是自己编写这个函数:
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:]]
答案 1 :(得分:1)
使用re.search
:
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)
正则表达式[^\W\d]
匹配所有字母字符。
\W
匹配所有非字母数字字符,\d
匹配所有数字字符。集合开头的^
反转选择以匹配所有非(非字母数字或数字),这对应于所有字母。
match
搜索字符串以查找匹配表达式第一次出现的索引。您可以根据匹配的位置对原始字符串进行切片,以获得两个列表。
答案 2 :(得分:1)
使用re.split()
onReceive()
产地:
import re
strings = [
"71 1 * abwhf",
"8 askg",
"*14 snbsb",
"00ab",
]
for string in strings:
a, b, c = re.split(r"([a-z])", string, 1, flags=re.I)
print(repr(a), repr(b + c))
这里的诀窍是我们在任何一个字母上分裂但只要求一次分割。通过将模式放在括号中,我们保存通常会丢失的分割字符。然后我们将拆分字符添加回第二个字符串的前面。
答案 3 :(得分:0)
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']