如何轻松检查字符串是否以4N空格开头?

时间:2017-07-17 15:47:59

标签: python

如何轻松检查字符串是否以4*N个空格开头,其中N是一个正整数?

我目前的代码是:

def StartsWith4Nspaces(string):
    count = 0
    for c in string:
        if c == ' ':
            count += 1
        else:
            break
    return count > 0 and count % 4 == 0

是否有更多的Pythonic方法可以将其写下来?

我有点希望发表一个声明(虽然比上面说的更清楚)。

谢谢。

9 个答案:

答案 0 :(得分:4)

您可以像这样检查:

my_string[:4*N] == ' ' * 4*N

您也可以将此支票转换为lambda

check = lambda my_string, N: my_string[:4*N] == ' ' * 4*N

并将其命名为:

check('  asdas', 2) # -> True
check('  asdas', 3) # -> False

或者,如果您想因任何原因(N)对N = 3进行硬编码:

check = lambda my_string: my_string[:12] == ' ' * 12
  

编辑:如果需要 4Nth + 1 字符作为空格,您可以将其纳入lambda

check_strict = lambda my_string, N: my_string[:4*N] == ' ' * 4*N and my_string[4*N + 1] != ' '

check_strict = lambda my_string: my_string[:12] == ' ' * 12 and my_string[13] != ' '

答案 1 :(得分:2)

您可以使用lstrip方法去除起始空格,然后比较剥离字符串和原始字符串的长度:

s = string.lstrip()
return ((len(string) - len(s)) % 4 == 0 and (len(string) - len(s) != 0)

(你甚至可以通过不为s设置变量来使它成为一行。)

答案 2 :(得分:2)

使用正则表达式可以正常工作:

>>> re.match('(?: {4})*(?! )', '')
<_sre.SRE_Match object at 0x7fef988e4780>
>>> re.match('(?: {4})*(?! )', '  ')
>>> re.match('(?: {4})*(?! )', '    ')
<_sre.SRE_Match object at 0x7fef988e4718>
>>> re.match('(?: {4})*(?! )', 'foo')
<_sre.SRE_Match object at 0x7fef988e4780>
>>> re.match('(?: {4})*(?! )', '  foo')
>>> re.match('(?: {4})*(?! )', '    foo')
<_sre.SRE_Match object at 0x7fef988e4718>
>>> re.match('(?: {4})*(?! )', '      foo')
>>> re.match('(?: {4})*(?! )', '        foo')
<_sre.SRE_Match object at 0x7fef988e4780>

请注意,这将允许N为0,并使用仅包含空格的字符串。有效匹配被视为true,但如果您希望结果严格为bool(),则可以将结果传递给bool。用*替换+将强制N大于0.

答案 3 :(得分:1)

def startsWith4Nspaces(s):
    if not s: return False

    numLeadingSpaces = len(s) - len(s.lstrip(' '))
    if not numLeadingSpaces: return False
    if numLeadingSpaces%4: return False
    return True

答案 4 :(得分:1)

有很多选择。请注意,您可以“切片”字符串以获取前四个字符。然后你可以将它与空格进行比较。这是一个例子:

mystring[:4] == '    '

您还可以使用字符串startswith函数:

mystring.startswith('    ')

请注意,如果字符串以5个或更多空格开头,则这两种方法仍将返回True。如果你需要方法找到正好4 起始空格,正则表达式可能更适合。

如果空格数可以是变量,只需使用' '*N,其中N是要匹配的空格数。

答案 5 :(得分:1)

您可以通过以下方式执行此操作

def StartsWith4Nspaces(s):
    diff = len(s) - len(s.lstrip(' '))
    return ((diff > 0) and not (diff%4))

print(StartsWith4Nspaces('abc'))
print(StartsWith4Nspaces(' ' * 1 + 'abc'))
print(StartsWith4Nspaces(' ' * 4 + 'abc'))
print(StartsWith4Nspaces(' ' * 6 + 'abc'))
print(StartsWith4Nspaces(' ' * 8 + 'abc'))

输出

False
False
True
False
True

基本上你删除了前导空格并比较了剥离空间和原始字符串的长度差异。

答案 6 :(得分:0)

假设你只想要完全 N个空格 - 不多,不少 - 在字符串的开头,然后使用正则表达式;

import re    
def starts_with_four_n_spaces(eval_string):
    return re.search(r'^(?:\s{4})+(?!\s).*$', eval_string) is not None

输出;

>>> starts_with_four_n_spaces('  foo')
False
>>> starts_with_four_n_spaces('        foo')
True

模式^(?:\s{4})+(?!\s).*$的工作原理如下

  • ^(?:\s{4})+匹配四个空格的倍数;
  • (?!\s)声称此后没有其他空格;
  • .*$匹配任何内容直到字符串结尾。

答案 7 :(得分:0)

另一个正则表达式的答案:

re.search('[^ ]', string).start() % 4 == 0

查找第一个非空格字符的索引和模数w.r.t. 4。

或与列表理解相同的方法:

next(i for i, c in enumerate(string) if c != ' ') % 4 == 0

答案 8 :(得分:0)

您可以slice字符串并使用all()内置方法检查切片string是否是您所需要的,如下所示:

st = '    testString'
N = 1
print all(x == ' ' for x in st[:4*N])

将输出

True