正则表达式:如何匹配相同字符序列?

3

我正在尝试匹配“任何不是.(句点)的连续相同字符链”

比如说,我有:

line = '....xooo......'

如果我这样做,

就会这样。

match in re.findall(r'[^\.]{2,}', line)

match返回"xooo"。

相反,我只想要"ooo",这是一串相同字符的序列。

我该怎么做?

2个回答

2
re.search(r'(([^.])\2{1,})', line).group(1)

说明:

"(([^.])\2{1,})"
    1st Capturing group (([^.])\2{1,})
    2nd Capturing group ([^.])
      Negated char class [^.] matches any character except:
         . The character .
    \2 1 to infinite times [greedy] Matches text saved in the 2nd capturing group

如果您想获得该约束条件的所有匹配项:
>>> line = '....xooo...xx..yyyyy.'
>>> map(lambda t: t[0], re.findall(r"(([^.])\2+)", line))
# ['ooo', 'xx', 'yyyyy']

现在尝试一下——Perl 到 Python 的问题 :-0 - dawg

1
line = '....xooo......aaaa...'
import re
print [whole for whole, _ in re.findall("(([^.])\\2+)", line)]

输出

['ooo', 'aaaa']

([^.]) 匹配除了 . 以外的任何字符,并将其捕获为一组。 \\2 指代内部捕获的组,该组是由 ([^.]) 匹配的字符,而 + 表示至少出现一次。因此,它匹配 ooo


嗯,这个可以用!但我在寻找更简短的方法...我以为有一种方法可以在一行代码中实现:( 你认为这是不可能的吗? - user2492270
@user2492270 完成。请现在检查我的答案。 - thefourtheye
为什么需要双括号?你只需要这样做 "([^.])\1+" 就可以了,对吧? - justhalf
@user2492270 不要抱怨长度! :) 尽管它构成了一个正则集,但你试图匹配的模式需要一个非常长的正则表达式,如果我们坚持真正的正则表达式;基本上是许多单独模式的大联合,这些单独模式分别匹配像 aaaaaa...bbbbb... 这样的东西。反向引用功能允许匹配非正则集;也就是说,为了使它像上面那样简洁,我们已经离开了正则表达式的领域,而你想让它更短。 :) - Kaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接