如何根据子字符串中包含的字符将字符串拆分为子字符串。例如,给定一个字符串"ABC12345..::"
,我想得到一个像['ABC', '12345', '..::']
这样的列表。我知道每个子字符串的有效字符,但我不知道长度。因此字符串也可能看起来像"CC123:....:"
,在这种情况下,我希望['CC', '123', ':....:']
为结果。
答案 0 :(得分:4)
根据你的例子,你似乎没有任何东西需要分开(例如C
和1
之间没有任何东西),但你所拥有的是一个格式良好的模式,你可以比赛。因此,只需创建一个模式,将您想要匹配的字符串分组:
>>> import re
>>> s = "ABC12345..::"
>>> re.match('([A-Z]*)([0-9]*)([\.:]*)', s).groups()
('ABC', '12345', '..::')
或者,将模式编译为可重用的正则表达式对象并执行此操作:
>>> patt = re.compile('([A-Z]*)([0-9]*)([\.:]*)')
>>> patt.match(s).groups()
('ABC', '12345', '..::')
>>> patt.match("CC123:....:").groups()
('CC', '123', ':....:')
答案 1 :(得分:2)
将每个组与以下正则表达式匹配
[0-9]+|[a-zA-Z]+|[.:]+
[0-9]+
任何数字都会重复,或者[a-zA-Z]+
任何时候重复的任何信件,或[.:]+
任何时候重复的任何点或冒号这将允许您以任何顺序匹配组,即:"123...xy::ab..98765PQRS"
。
import re
print(re.findall( r'[0-9]+|[a-zA-Z]+|[.:]+', "ABC12345..::"))
# => ['ABC', '12345', '..::']
答案 2 :(得分:1)
如果您想要非foreach (var face in Enum.GetValues(typeof(PlayingCards.CardSuits)).Cast<PlayingCards.CardSuits>())
{
foreach (var value in Enum.GetValues(typeof(PlayingCards.CardValues)).Cast<PlayingCards.CardValues>())
{
theDeck.Cards.Add(new PlayingCards.Card(face, value));
}
}
方法:
regex
输出:
value = 'ABC12345..::'
indexes = [i for i, char in enumerate(value) if char.isdigit()] # Collect indexes of any digits
arr = [ value[:indexes[0]], value[indexes[0]:indexes[-1]+1], value[indexes[-1]+1:] ] # Use splicing to build list
另一个字符串:
['ABC', '12345', '..::']
输出:
value = "CC123:....:"
indexes = [i for i, char in enumerate(value) if char.isdigit()] # Collect indexes of any digits
arr = [ value[:indexes[0]], value[indexes[0]:indexes[-1]+1], value[indexes[-1]+1:] ] # Use splicing to build list
修改强>
刚做了一个基准测试,metatoaster的方法比这快一点:)