【问题标题】:remove multiple consecutive occurrences of .* in a string with a single .* python使用单个 .* python 在字符串中删除多个连续出现的 .*
【发布时间】:2019-01-18 13:12:08
【问题描述】:

下面是我检查".*" 的多次连续出现的代码 在字符串中。如果有多个连续出现的".*",则将其替换为单个".*"。锻造:

import re

dot_star_check = re.compile('(\.\*){2,}')

k = ".*.*.*.*.*foo.*"

k = k.replace(?,".*") if dot_star_check.search(k) else k

print k

我应该写什么而不是?用单个.* 替换多个连续出现的.*

所以,预期的输出是.*foo.*

其他例子:

1.) foo.*.*.*.*bar.* ->foo.*bar.*

2.) .*foobar.*.*.*.*.* ->.*foobar.*

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    您可以使用re.sub(?:\.\*)+ 作为您的模式:

    import re
    dot_star_check = re.compile('(?:\.\*)+')
    k = ".*.*.*.*.*foo.*"
    k = re.sub(dot_star_check,'.*',k)
    
    print (k)
    

    打印:

    .*foo.*
    

    您还可以提高模式的效率,以便仅在使用 (?:\.\*){2,} 出现 2 次或更多次时执行替换:

    import re
    dot_star_check = re.compile('(?:\.\*){2,}')
    k = ".*.*.*.*.*foo.*"
    k = re.sub(dot_star_check,'.*',k)
    
    print (k)
    

    打印:

    .*foo.*
    

    【讨论】:

    • 为什么你有?和 : 一开始?
    • 它是一个非捕获组。使用非捕获组通常比使用捕获组更有效。
    • .* 的多次连续出现相当于单个 .* 对吧?
    • 我不确定我是否遵循,您能澄清一下吗?你的评论是什么意思?
    • 我正在尝试查找数据匹配模式 -> .*.*.*.*foo.*.* 或 bar.*.*.*foo.*.*.* 或其他任何内容;因此,不要使用上述正则表达式字符串进行搜索;我用单个 .* 删除多个连续的 .*?所以,我在问 .*.*.*.*foo.*.* 和 .*foo.* 之间是否有任何区别?我这样做是为了提高搜索效率
    【解决方案2】:

    我认为您可以使用 re.sub(\.\*)+ 作为您的正则表达式:

    s = 'foo.*.*.*.*bar.*'
    s2 = '.*foobar.*.*.*.*.* '
    k = ".*.*.*.*.*foo.*"
    
    >>> re.sub('(\.\*)+','.*',s)
    'foo.*bar.*'
    >>> re.sub('(\.\*)+','.*',s2)
    '.*foobar.* '
    >>> re.sub('(\.\*)+','.*',k)
    '.*foo.*'
    

    【讨论】:

    • 在这种情况下使用字符集是不正确的,因为它也会匹配 *. 而不是 .*
    猜你喜欢
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2020-11-22
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多