findall()返回整个字符串而不是列表

时间:2016-05-06 21:45:08

标签: python regex

我正在尝试在Python中使用正则表达式来匹配字符串:

pattern = re.compile(r"(\d+?\,\s[a-zA-Z]+?\,\s\d{4}\-\d{2}\-\d{2})")
string = '[ 1234, jack, 1987-09-02]'
ret = pattern.findall(string)

这将整个字符串作为list元素返回: ['1234,jack,1987-09-02']

但是我想获得一个列表,每个匹配作为一个元素: ['1234','jack','1987-09-02']

我知道'+'是贪婪的,但我加了'?'

2 个答案:

答案 0 :(得分:1)

您的模式匹配方括号内的所有内容,而您似乎只想获取由单词和连字符组成的字符块。

使用

pattern = re.compile(r"[\w-]+")

请参阅regex demo

请参阅IDEONE demo

import re
pattern = re.compile(r"[\w-]+")
string = '[ 1234, jack, 1987-09-02]'
ret = pattern.findall(string)
print(ret)
# => ['1234', 'jack', '1987-09-02']

模式详细信息:[\w-]是一个与单词字符(数字,字母或下划线)匹配一次或多次的字符类(由于+量词)。

替代解决方案:匹配可选空格,然后匹配并捕获所有非逗号符号

pattern = re.compile(r"\s*([^[\],]+)")

查看其他regexIDEONE演示。 re.findall仅将捕获的值返回到第1组以上,因此仅使用(...)捕获的内容(即][,以外的所有1个字符将被退回。)

答案 1 :(得分:0)

由于您只想匹配一次,请使用search代替findall并引入群组(live demo):

>>> import re
>>> string = '[ 1234, jack, 1987-09-02]'
>>> pattern = re.compile(r"(\d+?),\s([a-zA-Z]+?),\s(\d{4}\-\d{2}\-\d{2})")
>>> pattern.search(string).groups()
('1234', 'jack', '1987-09-02')

groups返回一个元组而不是一个列表,这意味着结果可以被解构(如number, name, birthday = pattern.search(string).groups())或传递,但不会被添加到。如果您确实需要列表,只需使用list(pattern.search(string).groups())