考虑一个字符串s = "aa,bb11,22 , 33 , 44,cc , dd "
。
我想使用 Python 中的regular expressions module将s
拆分为以下令牌列表,这类似于Perl提供的功能:
"aa,bb11"
"22"
"33"
"44,cc , dd "
注意:
到目前为止,我最好的尝试如下:
import re
pattern = r'(?<=\d)(\s*),(\s*)(?=\d)'
s = 'aa,bb11,22 , 33 , 44,cc , dd '
print re.compile(pattern).split(s)
但打印出来:
['aa,bb11', '', '', '22', ' ', ' ', '33', ' ', ' ', '44,cc , dd ']
这接近我想要的,因为我想要的4件事包含在列表中。我可以通过并删除任何空字符串和任何只包含空格/逗号的字符串,但我宁愿使用单行正则表达式来完成所有这些操作。
有什么想法吗?
答案 0 :(得分:2)
不要将捕获组放在\s*
:
pattern = r'(?<=\d)\s*,\s*(?=\d)'
答案 1 :(得分:0)
不要对\ s *进行分组,它们不会被捕获并写入输出中:
>>> import re
>>> s = 'aa,bb11,22 , 33 , 44,cc , dd '
>>> re.compile(r'(?<=\d)(\s*),(\s*)(?=\d)').split(s)
['aa,bb11', '', '', '22', ' ', ' ', '33', ' ', ' ', '44,cc , dd ']
>>> re.compile(r'(?<=\d)\s*,\s*(?=\d)').split(s)
['aa,bb11', '22', '33', '44,cc , dd ']
答案 2 :(得分:0)
您不需要使用正则表达式和拆分 - 这太复杂了。请参阅此&gt;&gt;
import re
s = "aa,bb11,22 , 33 , 44,cc , dd "
result = re.findall(ur"(?:^\s*|(?<=\d)\s*,\s*)(.*?)(?=\s*,\s*\d|\s*$)", s)
print(result)
输出:
['aa,bb11', '22', '33', '44,cc , dd']
测试here。
答案 3 :(得分:0)
您正在使用捕获括号中间的额外空白区域是两个(\s*)
捕获的内容,您可以使用非捕获括号,如下所示:
r'(?<=\d)(?:\s*),(?:\s*)(?=\d)'
虽然,根本不需要括号