Python(Perl-type)regex lookahead / lookbehind

时间:2012-07-22 15:42:43

标签: python regex regex-greedy lookahead lookbehind

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

我想使用 Python 中的regular expressions modules拆分为以下令牌列表,这类似于Perl提供的功能:

  1. "aa,bb11"
  2. "22"
  3. "33"
  4. "44,cc , dd "
  5. 注意:

    • 我想用逗号标记,但前提是这些逗号都有数字。
    • 我要定位的这些“数字逗号”周围的任何(可选)空格应该在结果中删除。可选的空格可能不止一个空格。
    • 任何其他空格应该保留原始字符串中显示的内容。

    到目前为止,我最好的尝试如下:

    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 个答案:

答案 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)'

虽然,根本不需要括号