查找字母,数字或符号组

时间:2015-10-19 02:51:23

标签: python regex

如何根据子字符串中包含的字符将字符串拆分为子字符串。例如,给定一个字符串"ABC12345..::",我想得到一个像['ABC', '12345', '..::']这样的列表。我知道每个子字符串的有效字符,但我不知道长度。因此字符串也可能看起来像"CC123:....:",在这种情况下,我希望['CC', '123', ':....:']为结果。

3 个答案:

答案 0 :(得分:4)

根据你的例子,你似乎没有任何东西需要分开(例如C1之间没有任何东西),但你所拥有的是一个格式良好的模式,你可以比赛。因此,只需创建一个模式,将您想要匹配的字符串分组:

>>> 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', '..::']

ideone demo

答案 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的方法比这快一点:)