【问题标题】:Split a string into a list by a set of strings通过一组字符串将一个字符串拆分为一个列表
【发布时间】:2021-06-27 03:25:42
【问题描述】:

我正在处理用乌兹别克语书写的文字。该语言有以下字母:

alphabet = ["a", "b", "c", "d", "e", "f", "g", "g'", "h", "i", 
    "j", "k", "l", "m", "n", "ng", "o", "o'", "p", "q", "r", 
    "s", "sh", "t", "u", "v", "x", "y", "z"]

如您所见,有些字母包含多个字符,例如o'g'sh。如何将这种语言的单词拆分为乌兹别克语字母列表?因此,例如,将单词"o'zbek" 拆分为["o'", "z", "b", "e", "k"]

如果我执行以下操作:

word = "o'zbek"
letters = list(word)

结果:

['o', "'", 'z', 'b', 'e', 'k']

这是不正确的,因为 o' 不在一起。

我也尝试过像这样使用 regex

import re
expression = "|".join(alphabet)
re.split(expression, word)

但结果是:

['', "'", '', '', '', '']

【问题讨论】:

  • 您说该语言有'sh' 作为字母,但它也有's''h' - 您希望脚本如何正确读取'asha'?是['a', 'sh', 'a'] 还是['a', 's', 'h', 'a']? (类似地,符号' 是否允许在其他上下文中使用,还是og 之后使用?)
  • 如果是sh的组合,则应识别为字母sh,因此'asha'应拆分为['a', 'sh', 'a']。而且,是的,' 仅用于字母 o'g'

标签: python regex string re


【解决方案1】:

为了优先考虑多于一个字符的字母,首先我们按照字符长度对字母表进行排序。然后像使用"|".join 一样将其传递给正则表达式,re.findall 给出拆分列表:

import re

sorted_alphabet = sorted(alphabet, key=len, reverse=True)
regex = re.compile("|".join(sorted_alphabet))

def split_word(word):
    return re.findall(regex, word)

使用:

>>> split_word("o'zbek")
["o'", 'z', 'b', 'e', 'k']

>>> split_word("asha")
['a', 'sh', 'a']

【讨论】:

    【解决方案2】:

    类似这样的工作。

    double = {"o'", "ng", "g'", "sh"}
    
    string = "o'zbek"
    letters = []
    while string:
        if string[:2] in double:
            letters.append(string[:2])
            string = string[2:]
        else:
            letters.append(string[0])
            string = string[1:]
    

    如果没有三个字母或更长的字母,你可以在一个集合中列出所有的双字母(在集合中查找元素比在列表中查找更快)。

    比你遍历字符串,并尝试找到字符串开头的双字母。如果存在,则将其存储在字母列表中。

    import re
    letters = re.findall("(o'|g'|ng|sh|[a-z])", string)
    

    也可以。

    【讨论】:

      【解决方案3】:

      如果您正在寻找专门的正则表达式,您可以尝试使用re.findall 与这样的模式:

      [a-fh-mp-rt-z]|[go]'?|ng?|sh?
      
      • [a-fh-mp-rt-z] - 包含所有普通字母的字符类。
      • |:或者:
      • [go]'? - "g" 或 "o" 后跟可选引号。
      • | - 或者:
      • ng? - 文字“n”后跟可选的“g”。
      • | - 或者:
      • sh? - 文字“s”后跟可选的“h”。

      在线查看demo

      import re
      word = "o'zbek"
      letters = re.findall("[a-fh-mp-rt-z]|[go]'?|ng?|sh?", word)
      print(letters)
      

      打印:

      ["o'", 'z', 'b', 'e', 'k']
      

      请注意,您也可以优先考虑那些“双重”字母,例如:[go]'|ng|sh|[a-z],有点像 @MustafaAydin 在他的 answer 中解释的那样。

      【讨论】:

        猜你喜欢
        • 2017-02-13
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多