通过一组字符串将字符串拆分为列表

Split a string into a list by a set of strings

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

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)

但结果是:

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

像这样的东西行得通。

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)

也有效。

为了优先处理多于一个字符的字母,我们首先根据字符的长度对字母表进行排序。然后像使用 "|".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']

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

[a-fh-mp-rt-z]|[go]'?|ng?|sh?
  • [a-fh-mp-rt-z] - 包含所有普通字母的字符 class。
  • | : 或:
  • [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 在他的 .

中的解释