2

考虑一个字符串s = "aa,bb11,22 , 33 , 44,cc , dd "

我想使用Python中的正则表达式模块s拆分为以下标记列表,这类似于 Perl 提供的功能:

  1. "aa,bb11"
  2. "22"
  3. "33"
  4. "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 件事都包含在列表中。我可以通过并摆脱任何空字符串和任何仅包含空格/逗号的字符串,但我宁愿有一个单行正则表达式来为我完成所有这些。

有任何想法吗?

4

4 回答 4

2

不要将捕获组放在\s*

pattern = r'(?<=\d)\s*,\s*(?=\d)'
于 2012-07-22T15:46:01.347 回答
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 ']
于 2012-07-22T15:53:48.000 回答
0

您不需要使用正则表达式和拆分 - 这太复杂了。看这个>>

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']

在这里测试一下。

于 2012-07-22T15:56:31.210 回答
0

您正在使用捕获括号,中间的额外空白是两个捕获的内容,(\s*)您可以使用非捕获括号,如下所示:

r'(?<=\d)(?:\s*),(?:\s*)(?=\d)'

虽然,括号并不是真正需要的

于 2012-07-22T16:03:04.317 回答