使用多个分隔符拆分Python字符串

使用多个分隔符拆分Python字符串,python,regex,string,tokenize,Python,Regex,String,Tokenize,我有一个有点复杂的文件名,它遵循我试图标记的模式s[num][alpha1][alpha2].ext。从中提取字母1和字母2的词汇包含在两个列表中 我发现这个问题很有用,但没有解决我的问题 在[num]和[alpha1]之间,字母前面有一个数字(一个相当简单的正则表达式),但在[alpha1]和[alpha2]之间,我在两个单词之间进行拆分 例如,给定文件名s13LoremIpsum.ext,我想要(“s”、“13”、“Lorem”、“Ipsum”) 实现这一目标的最佳方式是什么 请注意,在这种

我有一个有点复杂的文件名,它遵循我试图标记的模式
s[num][alpha1][alpha2].ext
。从中提取字母1和字母2的词汇包含在两个列表中

我发现这个问题很有用,但没有解决我的问题

[num]
[alpha1]
之间,字母前面有一个数字(一个相当简单的正则表达式),但在
[alpha1]
[alpha2]
之间,我在两个单词之间进行拆分

例如,给定文件名
s13LoremIpsum.ext
,我想要
(“s”、“13”、“Lorem”、“Ipsum”)

实现这一目标的最佳方式是什么

请注意,在这种特殊情况下,
[alpha2]
是一个字母,但我对这种情况的解决方案以及
[alpha1]
[alpha2]
是任意长度的单词的一般情况都感兴趣。还请注意,如果通过组合各个词典中的单词有多个可能的拆分,一般情况下可能会产生歧义,例如:

alpha1 = ["a", "ab"]
alpha2 = ["bc", "c"]
# How will we split?
splitString == ("a", "bc")
# --OR--
splitString == ("ab", "c")
然而,解决这种含糊不清的问题是次要的

alpha1, alpha2 = ["a", "ab", "Lorem"], ["bc", "c", "Ipsum"]
import re
pattern = re.compile("(s)(\\d+)("+"|".join(alpha1) + ")(" + "|".join(alpha2)+")")
data = "s13LoremIpsum.ext"
result = [pattern.match(data).group(i) for i in range(1, 5)]
print result
输出

['s', '13', 'Lorem', 'Ipsum']
实际编译的模式可以这样检查

print pattern.pattern
哪张照片

(s)(\d+)(a|ab|Lorem)(bc|c|Ipsum)
输出

['s', '13', 'Lorem', 'Ipsum']
实际编译的模式可以这样检查

print pattern.pattern
哪张照片

(s)(\d+)(a|ab|Lorem)(bc|c|Ipsum)
输出

['s', '13', 'Lorem', 'Ipsum']
实际编译的模式可以这样检查

print pattern.pattern
哪张照片

(s)(\d+)(a|ab|Lorem)(bc|c|Ipsum)
输出

['s', '13', 'Lorem', 'Ipsum']
实际编译的模式可以这样检查

print pattern.pattern
哪张照片

(s)(\d+)(a|ab|Lorem)(bc|c|Ipsum)



alpha1和alpha2是否总是以大写字母开头?它们是否有大写字母?是否有alpha3?是否有
alpha1
alpha2
匹配预定义值?你的另一个问题暗示他们会。在特定的情况下,字母1和字母2都是大写的。在一般情况下,其中任何一个单词都可以是大写和小写的任意组合。是的,alpha1和alpha2是从两个列表中提取的,每个列表都包含预定义的可能值。在这种情况下,您需要按照Eye的建议执行。alpha1和alpha2是否总是以大写字母开头?它们是否有大写字母?是否有alpha3?是否有
alpha1
alpha2
匹配预定义值?你的另一个问题暗示他们会。在特定的情况下,字母1和字母2都是大写的。在一般情况下,其中任何一个单词都可以是大写和小写的任意组合。是的,alpha1和alpha2是从两个列表中提取的,每个列表都包含预定义的可能值。在这种情况下,您需要按照Eye的建议执行。alpha1和alpha2是否总是以大写字母开头?它们是否有大写字母?是否有alpha3?是否有
alpha1
alpha2
匹配预定义值?你的另一个问题暗示他们会。在特定的情况下,字母1和字母2都是大写的。在一般情况下,其中任何一个单词都可以是大写和小写的任意组合。是的,alpha1和alpha2是从两个列表中提取的,每个列表都包含预定义的可能值。在这种情况下,您需要按照Eye的建议执行。alpha1和alpha2是否总是以大写字母开头?它们是否有大写字母?是否有alpha3?是否有
alpha1
alpha2
匹配预定义值?你的另一个问题暗示他们会。在特定的情况下,字母1和字母2都是大写的。在一般情况下,其中任何一个单词都可以是大写和小写的任意组合。是的,alpha1和alpha2是从两个列表中提取的,每个列表都包含预定义的可能值。在这种情况下,您需要按照Eye的建议执行。太棒了,看起来真不错!然而,我在这里遇到了一个问题:让
alpha1,alpha2=[“AB”,“ABC”],[“C”,“D”]
。现在让我们看看
data=“s13ABCC.ext”
。我们输出
['s','13','AB','C']
。请注意,如果alpha1的项目顺序已切换,我们将得到正确的答案。我们如何修复这种行为?@Walker如果我们必须手动拆分它们,我们将如何操作?
CC
不应该是
alpha2
的一部分吗?我想我们避开了我在帖子中提到的歧义,但在这个例子中,alpha2词典末尾唯一包含的单词是
C
,因此alpha1应该计算为
ABC
,而不仅仅是
AB
@Walker,然后在
AB
之前将
ABC
包含在
alpha1
中。问题解决:)太棒了,看起来真不错!然而,我在这里遇到了一个问题:让
alpha1,alpha2=[“AB”,“ABC”],[“C”,“D”]
。现在让我们看看
data=“s13ABCC.ext”
。我们输出
['s','13','AB','C']
。请注意,如果alpha1的项目顺序已切换,我们将得到正确的答案。我们如何修复这种行为?@Walker如果我们必须手动拆分它们,我们将如何操作?
CC
不应该是
alpha2
的一部分吗?我想我们避开了我在帖子中提到的歧义,但在这个例子中,alpha2词典末尾唯一包含的单词是
C
,因此alpha1应该计算为
ABC
,而不仅仅是
AB
@Walker,然后在
AB
之前将
ABC
包含在
alpha1
中。问题解决:)太棒了,看起来真不错!然而,我在这里遇到了一个问题:让
alpha1,alpha2=[“AB”,“ABC”],[“C”,“D”]
。现在让我们看看
data=“s13ABCC.ext”
。我们输出
['s','13','AB','C']
。请注意,如果alpha1的项目顺序已切换,我们将得到正确的答案。我们如何修复这种行为?@Walker如果我们必须手动拆分它们,我们将如何操作?
CC
不应该是
alpha2
的一部分吗?我想我们正在避开我提到的模糊性