我正在尝试在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']
我知道'+'是贪婪的,但我加了'?'
答案 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*([^[\],]+)")
查看其他regex和IDEONE演示。 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())
。