Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找字母、数字或符号的组_Python_Regex - Fatal编程技术网

Python 查找字母、数字或符号的组

Python 查找字母、数字或符号的组,python,regex,Python,Regex,如何根据子字符串中包含的字符将字符串拆分为子字符串。例如,给定一个字符串“ABC12345::”,我想得到一个类似于['ABC','12345','…:']的列表。我知道每个子字符串的有效字符,但不知道长度。因此,字符串也可能看起来像“CC123:…:”,在这种情况下,我希望得到['CC','123',':…:']。根据您的示例,您似乎没有任何可拆分的内容(例如C和1之间没有任何内容),但您拥有的是一个格式良好的模式,可以匹配。因此,只需创建一个模式,将要匹配的字符串分组: >>&g

如何根据子字符串中包含的字符将字符串拆分为子字符串。例如,给定一个字符串“ABC12345::”,我想得到一个类似于
['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’<代码>之类的情况吗?是的,原则上,三个“块”中的字符集可以重叠。中间的块甚至可以是空的。所以,是的,这会引起问题。但对于我的具体问题,这种尽力而为的方法非常有效。我差一点就忘了,只是忘了单个块周围的
(…)
括号。谢谢工作起来很有魅力。我差一点就忘了,只是忘了单个块周围的
(…)
括号。谢谢