0

我下面的代码目前出错了,前三个示例工作正常,但最后一个示例无法正常工作。

我已经评论显示输出是什么以及它应该是什么。

import re

print(filter(None, re.split(r'(\d+) (\w.*) (\d.*)', '6 Name 100/100')))
#['6', 'Name' '100/100']
## Correct

print(filter(None, re.split(r'(\d+) (\w.*) (\d.*)', '6 Name Name-Name 1/1001')))
#['6', 'Name Name-Name', '1/1001']
## Correct

print(filter(None, re.split(r'(\d+) (\w.*) (\d.*)', '6 Name Name`Name 1240/1422')))
#['6', 'Name Name`Name', '1240/1422']
## Correct

print(filter(None, re.split(r'(\d+) (\w.*) (\d.*)', '6 Name Name`Name None')))
#['6', 'Name Name`Name None']
## Wrong, It should be returning:
#['6', 'Name Name`Name', 'None']

欢迎任何想法。

谢谢-Hyflex

4

2 回答 2

4

似乎您正在尝试获取一个列表并将空格视为分隔符,您似乎想要获取第一个和最后一个元素,然后剩下的所有内容都将转到该结果列表的第二个元素。

如果是这样,您可以使用 match 代替:

>>> print re.match(r'^(\S+) (.*?) (\S+)$', '6 Name Name`Name None').groups()
('6', 'Name Name`Name', 'None')

正则表达式101演示

\S匹配每个不是空格的字符,^and$分别匹配行的开头和结尾。

于 2013-09-26T18:25:47.017 回答
1

所以 * 是一个贪婪的量词,并且会继续下去,直到它不能再去了。所以你需要添加一个?之后

(\d+) (\w.*?) (\d.*)

最后一组也没有\d前缀.*

于 2013-09-26T18:18:55.010 回答