Python-如何按非字母数字分割字符串,但同时保留任何非字母数字
string=Tes.t/&hi-& 预期产出-[Tes,t,,/,&,hi,,,,,&] 或 预期输出-[Tes,t,/&,hi,-&]Python-如何按非字母数字分割字符串,但同时保留任何非字母数字,python,list,Python,List,string=Tes.t/&hi-& 预期产出-[Tes,t,,/,&,hi,,,,,&] 或 预期输出-[Tes,t,/&,hi,-&] 最好后一种输出会更好,但两者都能完美工作 您可以尝试检查字符是否为ascii_字母,并根据这一点将其添加到同一字符串或不同的最后一个字符串中。这可能看起来像 from string import ascii_letters import sys from typing import List def main(input_string: str) ->
最好后一种输出会更好,但两者都能完美工作 您可以尝试检查字符是否为ascii_字母,并根据这一点将其添加到同一字符串或不同的最后一个字符串中。这可能看起来像
from string import ascii_letters
import sys
from typing import List
def main(input_string: str) -> List[str]:
output = []
sub_string = ''
last_was_ascii = None
for char in input_string:
char_is_ascii = char in ascii_letters
if last_was_ascii is None or char_is_ascii == last_was_ascii:
sub_string += char
else:
output.append(sub_string)
sub_string = char
last_was_ascii = char_is_ascii
output.append(sub_string)
print(output)
if __name__ == "__main__":
main(*sys.argv[1:])
给定命令行输入python示例_file.py Tes.t/&hi-&将打印['Tes'、'、't'、'/&'、'hi'、'-&',],即您列出的第二个示例
虽然有点冗长,但这是一个技巧代码
试验
输出
一种解决方案是使用正则表达式: 查找所有字母数字:
an = re.findall("[a-zA-Z0-9]+", s)
non_an = re.findall("[^a-zA-Z0-9]+", s)
查找所有非字母数字:
an = re.findall("[a-zA-Z0-9]+", s)
non_an = re.findall("[^a-zA-Z0-9]+", s)
拉上拉链:
ziped = zip(an, non_an)
拉平拉链:
flat = sum(ziped, ())
或在一行中:
sum(zip(re.findall("[a-zA-Z0-9]+", s), re.findall("[^a-zA-Z0-9]+", s)), ())
要涵盖字母数字多于非字母数字的情况,或反之亦然,请使用itertools.zip_longest并删除空值:
from itertools import zip_longest
[x for x in sum(zip_longest(re.findall("\w+", s), re.findall("[\W]+", s)), ()) if x]
到目前为止您尝试了什么?为什么不将a-zA-Z0-9替换为\w?好的:您可以将[a-zA-Z0-9]+替换为\w+,将[^a-zA-Z0-9]+替换为[\w]+
from itertools import zip_longest
[x for x in sum(zip_longest(re.findall("\w+", s), re.findall("[\W]+", s)), ()) if x]