我想在字符串第一次出现时将其拆分为一个字符,该字符属于字符列表。如何在python中实现这一点?

我想在字符串第一次出现时将其拆分为一个字符,该字符属于字符列表。如何在python中实现这一点?,python,string,python-3.x,split,Python,String,Python 3.x,Split,基本上,我有一个特殊角色的列表。如果字符串属于此列表并且存在于字符串中,则需要将其拆分为一个字符。关于以下内容: def find_char(string): if string.find("some_char"): #do xyz with some_char elif string.find("another_char"): #do xyz with another_char else: return False 等等。我认为这样做的方式是: d

基本上,我有一个特殊角色的列表。如果字符串属于此列表并且存在于字符串中,则需要将其拆分为一个字符。关于以下内容:

def find_char(string):

  if string.find("some_char"):
     #do xyz with some_char
  elif string.find("another_char"):
     #do xyz with another_char
  else:
     return False
等等。我认为这样做的方式是:

def find_char_split(string):
     char_list = [",","*",";","/"]
     for my_char in char_list:
         if string.find(my_char) != -1:
             my_strings = string.split(my_char)
             break
         else:
             my_strings = False

     return my_strings
有没有更像蟒蛇的方法?或者上述程序可以吗?请帮忙,我对python不是很精通

编辑:我希望它在字符的第一次出现时分割,这是第一次遇到。也就是说,如果字符串包含多个逗号和多个星星,那么我希望它被第一次出现的逗号分割。请注意,如果星星先出现,那么它将被星星打破

我倾向于使用re模块,因为用于拆分多个任意字符的表达式非常简单:

r'[,*;/]'
括号将创建一个字符类,该字符类与括号内的任何内容相匹配。代码如下所示:

import re

results = re.split(r'[,*;/]', my_string, maxsplit=1)
maxsplit参数使拆分只发生一次

如果多次执行相同的拆分,则可以编译正则表达式并更快地搜索同一表达式,但请参见:

如果这种加速很重要,那么它可能并不重要。您可以在函数中使用编译后的版本,而不是每次都重新编译。然后创建一个单独的函数来存储实际编译的表达式:

def split_chars(chars, maxsplit=0, flags=0, string=None):
    # see note about the + symbol below
    c = re.compile('[{}]+'.format(''.join(chars)), flags=flags)
    def f(string, maxsplit=maxsplit):
        return c.split(string, maxsplit=maxsplit)
    return f if string is None else f(string)
然后:

special_split = split_chars(',*;/', maxsplit=1)
result = special_split(my_string)
而且:

result = split_chars(',*;/', my_string, maxsplit=1)
+字符的用途是将多个分隔符视为一个分隔符(如果需要的话)。谢谢Jon Clements。如果不需要这样做,您可以使用上面的re.compile'[{}]'.format.joinchars。请注意,如果maxsplit=1,则不会产生任何影响


最后:看一下Python中正则表达式的快速介绍,以及更多信息的详细介绍。

对于这种情况,我更喜欢正则表达式模块re模块中的split函数。对。。。那么abc,*def,xyz等于['abc','*def,xyz']还是['abc','*def','xyz']?@JonClements这将是前者。就我的代码而言,第二个是无效的大小写。您使用的不是or,而是一个同样可以避免转义的字符类。。。关于拆分器“[,*/;]”,我的字符串。。。并在那里添加+以将连续分隔符字符视为一个-这可能需要,也可能不需要,这取决于…@JonClements的优点。我自己最近才开始使用正则表达式。而且-使用编译正则表达式的速度并不一定像人们所认为的那么快。。。re引擎会保留一定数量的表达式以供查找,因此如果您使用相同的字符串常量,它已经为您重新使用了一个已编译的表达式。@shrey只是为了理解:在后一种情况下,答案中带有termination+符号的正则表达式会忽略所有字符的多个分隔符。我将进行编辑,以便有一个引用参数。不太难。@ShreyMarwaha根据您对我对您的Q的评论的回复,它看起来像是re.split“[,*;/”,“abc,*def,xyz;不管怎样,'maxspit=1都可以-因此您可以使用此答案。
result = split_chars(',*;/', my_string, maxsplit=1)