为什么这个模式不能捕获python中所有重复的字符?

2024-07-03 07:42:28 发布

您现在位置:Python中文网/ 问答频道 /正文

问题是要编写正则表达式模式来找出字符串中的任何重复字符。你知道吗

For example:

The first target of "abcabcbb" is "abca" with repeated 'a'
The first target of "abba" is "abb" with repeated 'b'
...

我在python3中尝试了regex模式。你知道吗

当我把模式写为:

pair = re.compile(r".*(.).*\1")

结果如下:

>>> s
['abcabcbb', '   ', 'abba', 'uqinntq']
>>> for ss in s:
...     res=pair.search(ss)
...     print(ss, res.group(), res.groups())
... 

abcabcbb abcabcbb ('b',)    ..............WRONG!
        (' ',)
abba abb ('b',)             ..............OK!
uqinntq uqinn ('n',)        ..............WRONG!

当我把图案改成:

pair = re.compile(r".*?(.).*?\1")

然后我得到:

abcabcbb abca ('a',)       ...............OK!
       (' ',)
abba abba ('a',)           ...............WRONG!
uqinntq uqinntq ('q',)     ...............WRONG!

我不知道为什么我得到这些结果。在这种情况下,如何编写regex模式?你知道吗


Tags: ofthetargetiswith模式resss
2条回答

你得到了完全正确的结果。你知道吗

让我们以您的第一个regex.*(.).*\1和一些示例为例。你知道吗

例如,字符串是abcabcbb,这里是b。让我们看看为什么。你知道吗

您的正则表达式是.*(.).*\1,它以.*开头,这是贪婪的,这意味着它将消耗尽可能多的字符,同时提供匹配。所以.*捕获abcabc,因为这是.*可以做的最大可能的捕获,并且(.)将匹配b.*将匹配空字符串,\1将再次匹配b,这就是匹配的结束。因此,(.)捕获了您正在获取的b。所以这不是一个错误的匹配。你知道吗

现在让我们以regex的非贪婪版本为例,它是.*?(.).*?\1

让示例字符串为abba。这给了你a,让我们看看原因。你知道吗

您的正则表达式.*?(.).*?\1开始与.*?匹配,因此这次尝试尽可能少地匹配,因此不匹配任何内容,然后(.)匹配a,然后.*?匹配bb(记住它需要匹配最小值,但仍然生成匹配),最后\1匹配最后的a。这就是匹配结束的方式,在(.)中得到a,这是正确的。你知道吗

一个非正则表达式的解决方案是使用Counter,它统计每个字符的频率。你知道吗

from collections import Counter

s = ['abcabcbb', '   ', 'abba', 'uqinntq']

for ss in s:
    #If string is non-empty
    if ss.strip():
        #This will help us calculate frequencies of all characters
        c = Counter(ss)
        print(ss)
        for key, value in c.items():
            #If characters are repeated, print them
            if value > 1:
                print('{} is repeated {} times'.format(key, value))

输出将为。你知道吗

abcabcbb
a is repeated 2 times
b is repeated 4 times
c is repeated 2 times
abba
a is repeated 2 times
b is repeated 2 times
uqinntq
q is repeated 2 times
n is repeated 2 times

相关问题 更多 >