如何轻松检查字符串是否以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方法可以将其写下来?
我有点希望发表一个声明(虽然比上面说的更清楚)。
谢谢。
答案 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