通过一组字符串将字符串拆分为列表
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 在他的 .
中的解释
我正在处理用乌兹别克语书写的文字。该语言有以下字母:
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 在他的