【问题标题】:Python: Finding Regex occurance for variable charPython:查找变量 char 的正则表达式
【发布时间】:2013-11-12 23:39:34
【问题描述】:

例如,我知道,如果我想找出所有连续出现的 'a' 的长度

输入=“1111aaaaa11111aaaaaaa111aaa”,我可以做

[len(s) for s in re.findall(r'a+', input)]


但是,我不确定如何使用 char 变量来执行此操作。例如,

CHAR = 'a'
[len(s) for s in re.findall(r'??????', input)]    # Trying to find occurrences of CHARs..

有没有办法做到这一点?

【问题讨论】:

    标签: python regex string character


    【解决方案1】:

    这是一个适用于任何长度的字符串的通用解决方案:

    CHAR = 'a'
    [len(s) for s in re.findall(r'(?:{})+'.format(re.escape(CHAR)), input)]
    

    或使用itertools 的替代方法(仅限单个字符):

    import itertools
    [sum(1 for _ in g) for k, g in itertools.groupby(input) if k == CHAR]
    

    【讨论】:

    • 如果你要走 itertools 路线,将每个组都列成一个列表似乎很可惜。只需编写一个简单的ilen 函数,或者使用来自more-itertools 的函数,或者将其内联为sum(1 for _ in g)
    • @abarnert 是的,这是一个很好的观点,根据您的建议进行了编辑以避免临时列表。
    【解决方案2】:

    我想你要的是:

    [len(s) for s in re.findall(r'{}+'.format(CHAR), input)]
    

    当然,如果CHAR 是一个特殊值,例如\,这将不起作用。如果这是一个问题:

    [len(s) for s in re.findall(r'{}+'.format(re.escape(CHAR)), input)]
    

    如果您想匹配两个或多个而不是一个或多个,则其语法为{2,}。正如the docs 所说:

    {m,n} 使生成的 RE 匹配前一个 RE 的 m 到 n 个重复,尝试匹配尽可能多的重复。例如,a{3,5} 将匹配 3 到 5 个 'a' 字符。省略 m 指定下限为零,省略 n 指定无限上限。例如,a{4,}b 将匹配aaaab 或一千个'a' 字符后跟b,但不匹配aaab...

    当我们使用{} 进行字符串格式化时,这有点难看,所以让我们切换到%-formatting:

    [len(s) for s in re.findall(r'%s{2,}' % (re.escape(CHAR),), input)]
    

    …或者只是简单的串联:

    [len(s) for s in re.findall(re.escape(CHAR) + r'{2,}', input)]
    

    【讨论】:

    • 谢谢!!抱歉,还有一个问题:从您的 Regex findall 中,如何检测超过 2 个连续字符?我认为 r'{}1+' 会起作用,但它不起作用:(
    • 您为什么认为1+ 会起作用?这给了你,例如a1+,它是一个a,后跟一个或多个1。让我编辑答案以解释如何做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2020-06-03
    • 2021-09-12
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多