【问题标题】:Regex pattern for every alternate space每个备用空间的正则表达式模式
【发布时间】:2020-10-05 07:50:19
【问题描述】:

我有以下一行

17 3 33 79 38 3 23 119 36 3 27 17 32 10 18 9 93 6

我想用一个单词替换每个备用空格,比如'x',让它看起来像

17 3x33 79x38 3x23 119x36 3x27 17x32 10x18 9x93 6

我正在使用 Python 3。

尝试了这种模式,但它正在替换每个空格

(?=\d{0,3})(?=\s\d{0,4})\s

【问题讨论】:

    标签: python regex regex-lookarounds


    【解决方案1】:

    您可以将“每个其他空格”定义为“每个空格,其后面只有一对数字,直到字符串结尾”

    \s(?=(?:\b\d{1,3}\s\d{1,3}\b\s*)*$)
    

    细分:

    \s # 我们要替换的空间 (?= # 积极前瞻 (?: # 非捕获组 \b # 一个单词边界(不匹配部分数字) \d{1,3} # 一个数字 \s # 中间有一个空格(隐式 \b) \d{1,3} # 一个数字 \b # 一个单词边界 \s* # 一个连接到下一个数字对的空格(或者在字符串末尾没有空格) )* # 结束非捕获组,重复(“只有数字对”) $ # 字符串结尾(“直到字符串结尾”) ) # 结束前瞻

    要选择其他个空格,您可以在$之前添加一个\d{1,3}


    但实际上,我可能会在没有正则表达式的情况下解决这个问题。

    input_str = '17 3 33 79 38 3 23 119 36 3 27 17 32 10 18 9 93 6'
    numbers = numbers = input_str.split(' ')
    
    output_str = ''.join([n + ('x' if i % 2 else ' ') for i, n in enumerate(numbers)])
    # => '17 3x33 79x38 3x23 119x36 3x27 17x32 10x18 9x93 6x'
    
    output_str = output_str.rstrip('x')
    # => '17 3x33 79x38 3x23 119x36 3x27 17x32 10x18 9x93 6'
    

    或者,更喜欢itertools(虽然我个人更喜欢上面的):

    from itertools import cycle
    
    input_str = '17 3 33 79 38 3 23 119 36 3 27 17 32 10 18 9 93 6'
    
    pairs = zip(input_str.split(' '), cycle([' ', 'x']))
    # => [('17', ' '), ('3', 'x'), ('33', ' '), ... ]
    
    output_str = ''.join(p for pair in pairs for p in pair)
    # => '17 3x33 79x38 3x23 119x36 3x27 17x32 10x18 9x93 6x'
    
    output_str = output_str.rstrip('x')
    # => '17 3x33 79x38 3x23 119x36 3x27 17x32 10x18 9x93 6'
    

    【讨论】:

    • 这太棒了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    相关资源
    最近更新 更多