Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Hackerrank代码周33模式计数_Python_Regex - Fatal编程技术网

Python Hackerrank代码周33模式计数

Python Hackerrank代码周33模式计数,python,regex,Python,Regex,嗨,我一直在Hackerrank上尝试这个问题。 我曾尝试在python中使用正则表达式。但它在测试用例“1001010001”中失败。 有人能帮忙吗?它给出的输出为2,但预期输出为3。 (如10010110001所示)。python实际上是如何处理这一点的(就算法而言?) 正则表达式不计算重叠的匹配项 但是,您可以轻松地修改代码,以: import re patregex=re.compile(r'10*1') text= raw_input().strip('\n') cnt = 0

嗨,我一直在Hackerrank上尝试这个问题。 我曾尝试在python中使用正则表达式。但它在测试用例“1001010001”中失败。 有人能帮忙吗?它给出的输出为2,但预期输出为3。 (如10010110001所示)。python实际上是如何处理这一点的(就算法而言?)


正则表达式不计算重叠的匹配项

但是,您可以轻松地修改代码,以:

import re

patregex=re.compile(r'10*1')

text= raw_input().strip('\n')

cnt = 0
pos = 0
match = patregex.search(text)
while match:
    match = patregex(text,match.end()-1)
    cnt += 1
print(cnt)
重新导入
patregex=re.compile(r'10*1')
text=raw_input().strip('\n')
cnt=0
pos=0
match=patregex.search(文本)
比赛时:
match=patregex(文本,match.end()-1)
cnt+=1
打印(cnt)
因此,在这里,当我们找到一个
匹配项
时,我们将尝试找到另一个匹配项开始,并找到上一个匹配项的
匹配.end()-1
,直到找不到其他匹配项为止。我们一直这样做,直到找不到匹配项为止。对于每个匹配,我们增加
cnt+=1

我们可以使用
match.end()-1
,因为每个匹配都以一个1开头,后跟零个或多个0和另一个1。因此,我们知道模式只能在最后一次匹配时重新启动


这种方法还可以节省内存:因为在找到第一个匹配项后,在查找下一个匹配项时,您可以简单地忘记该匹配项。
findall(..)
方法需要同时在内存中存储所有匹配项。

正则表达式不计算重叠匹配项

但是,您可以轻松地修改代码,以:

import re

patregex=re.compile(r'10*1')

text= raw_input().strip('\n')

cnt = 0
pos = 0
match = patregex.search(text)
while match:
    match = patregex(text,match.end()-1)
    cnt += 1
print(cnt)
重新导入
patregex=re.compile(r'10*1')
text=raw_input().strip('\n')
cnt=0
pos=0
match=patregex.search(文本)
比赛时:
match=patregex(文本,match.end()-1)
cnt+=1
打印(cnt)
因此,在这里,当我们找到一个
匹配项
时,我们将尝试找到另一个匹配项开始,并找到上一个匹配项的
匹配.end()-1
,直到找不到其他匹配项为止。我们一直这样做,直到找不到匹配项为止。对于每个匹配,我们增加
cnt+=1

我们可以使用
match.end()-1
,因为每个匹配都以一个1开头,后跟零个或多个0和另一个1。因此,我们知道模式只能在最后一次匹配时重新启动


这种方法还可以节省内存:因为在找到第一个匹配项后,在查找下一个匹配项时,您可以简单地忘记该匹配项。
findall(…)
方法需要同时将所有匹配项存储在内存中。

可以通过正则表达式和前瞻模式来解决重叠
1

import re

def count_code33(input_string):
    return len(re.findall('10*(?=1)', input_string))

# Test section    
def test(input_string):
    print('{!r} => {}'.format(input_string, count_code33(input_string)))

test('')
test('0')
test('10')
test('1001010001')
test('1001 101 10001')
test('100110110001')
test('1111')
结果:

'' => 0
'0' => 0
'10' => 0
'1001010001' => 3
'1001 101 10001' => 3
'100110110001' => 5
'1111' => 3

它可以通过正则表达式和前瞻模式来解决,以捕捉重叠
1

import re

def count_code33(input_string):
    return len(re.findall('10*(?=1)', input_string))

# Test section    
def test(input_string):
    print('{!r} => {}'.format(input_string, count_code33(input_string)))

test('')
test('0')
test('10')
test('1001010001')
test('1001 101 10001')
test('100110110001')
test('1111')
结果:

'' => 0
'0' => 0
'10' => 0
'1001010001' => 3
'1001 101 10001' => 3
'100110110001' => 5
'1111' => 3

404
当您点击链接时……请在问题正文中包含问题的基本部分。第二个挑战。正则表达式不匹配重叠部分(默认情况下)。谢谢。在正则表达式中有解决这个问题的方法吗?要解决此问题?
404
当您单击链接时……请在问题正文中包含问题的基本部分。第二个挑战。正则表达式不匹配重叠部分(默认情况下)。谢谢。在正则表达式中有解决这个问题的方法吗?要解决这个问题吗?非常感谢你的帮助:)非常感谢你的帮助:)非常感谢你的帮助:)非常感谢你的帮助:)