Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List - Fatal编程技术网

Python-如何按非字母数字分割字符串,但同时保留任何非字母数字

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) ->

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