问题是要编写正则表达式模式来找出字符串中的任何重复字符。你知道吗
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模式?你知道吗
你得到了完全正确的结果。你知道吗
让我们以您的第一个regex
.*(.).*\1
和一些示例为例。你知道吗例如,字符串是
abcabcbb
,这里是b
。让我们看看为什么。你知道吗您的正则表达式是
.*(.).*\1
,它以.*
开头,这是贪婪的,这意味着它将消耗尽可能多的字符,同时提供匹配。所以.*
捕获abcabc
,因为这是.*
可以做的最大可能的捕获,并且(.)
将匹配b
,.*
将匹配空字符串,\1
将再次匹配b
,这就是匹配的结束。因此,(.)
捕获了您正在获取的b
。所以这不是一个错误的匹配。你知道吗现在让我们以regex的非贪婪版本为例,它是
.*?(.).*?\1
让示例字符串为
abba
。这给了你a
,让我们看看原因。你知道吗您的正则表达式
.*?(.).*?\1
开始与.*?
匹配,因此这次尝试尽可能少地匹配,因此不匹配任何内容,然后(.)
匹配a
,然后.*?匹配bb
(记住它需要匹配最小值,但仍然生成匹配),最后\1
匹配最后的a
。这就是匹配结束的方式,在(.)
中得到a
,这是正确的。你知道吗一个非正则表达式的解决方案是使用Counter,它统计每个字符的频率。你知道吗
输出将为。你知道吗
相关问题 更多 >
编程相关推荐