Python 查找字母、数字或符号的组
如何根据子字符串中包含的字符将字符串拆分为子字符串。例如,给定一个字符串“ABC12345::”,我想得到一个类似于Python 查找字母、数字或符号的组,python,regex,Python,Regex,如何根据子字符串中包含的字符将字符串拆分为子字符串。例如,给定一个字符串“ABC12345::”,我想得到一个类似于['ABC','12345','…:']的列表。我知道每个子字符串的有效字符,但不知道长度。因此,字符串也可能看起来像“CC123:…:”,在这种情况下,我希望得到['CC','123',':…:']。根据您的示例,您似乎没有任何可拆分的内容(例如C和1之间没有任何内容),但您拥有的是一个格式良好的模式,可以匹配。因此,只需创建一个模式,将要匹配的字符串分组: >>&g
['ABC','12345','…:']
的列表。我知道每个子字符串的有效字符,但不知道长度。因此,字符串也可能看起来像“CC123:…:”
,在这种情况下,我希望得到['CC','123',':…:']
。根据您的示例,您似乎没有任何可拆分的内容(例如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', ':....:')
根据您的示例,您似乎没有任何可拆分的内容(例如,
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', ':....:')
如果您想要非正则表达式方法:
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', '..::']
['CC', '123', ':....:']
另一个字符串:
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
输出:
['ABC', '12345', '..::']
['CC', '123', ':....:']
编辑:
刚刚做了一个基准测试,metatoaster的方法比这个稍微快一点:)如果你想要一个非
正则表达式的方法:
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', '..::']
['CC', '123', ':....:']
另一个字符串:
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
输出:
['ABC', '12345', '..::']
['CC', '123', ':....:']
编辑:
刚刚做了一个基准测试,metatoaster的方法比这个稍微快一点:)用下面的正则表达式匹配每个组
[0-9]+|[a-zA-Z]+|[.:]+
[0-9]+
任何重复的数字,或
[a-zA-Z]+
任何重复的字母,或
[.:]+
任何时间重复的点或冒号
这将允许您以任何顺序匹配组,即:“123…xy::ab..98765PQRS”
将每组与以下正则表达式匹配
[0-9]+|[a-zA-Z]+|[.:]+
[0-9]+
任何重复的数字,或
[a-zA-Z]+
任何重复的字母,或
[.:]+
任何时间重复的点或冒号
这将允许您以任何顺序匹配组,即:“123…xy::ab..98765PQRS”
你是说你想分成字母、数字和符号吗?你必须考虑诸如“代码>”ABC123DEF’/代码>的情况吗?是的,原则上,三个“块”中的字符集可以重叠。中间的块甚至可以是空的。所以,是的,这会引起问题。但对于我的具体问题,这种最佳的努力方法是合理的,你的意思是你想把它分成字母、数字和符号吗?你必须考虑诸如“代码>”ABC123DEF’<代码>之类的情况吗?是的,原则上,三个“块”中的字符集可以重叠。中间的块甚至可以是空的。所以,是的,这会引起问题。但对于我的具体问题,这种尽力而为的方法非常有效。我差一点就忘了,只是忘了单个块周围的(…)
括号。谢谢工作起来很有魅力。我差一点就忘了,只是忘了单个块周围的(…)
括号。谢谢