对于作业,我必须从以“W”和“Z”开头并以“n”和“t”结尾的文本中打印行(所以W-n,W-t,Z-n,Z-t组合)。我现在有一个有效的代码,但似乎有点长,我想知道是否有办法缩短它?
这是代码:
import sys
def main():
for line in sys.stdin:
line = line.rstrip()
if line.startswith("W") and line.endswith("n"):
print(line)
if line.startswith("W") and line.endswith("t"):
print(line)
if line.startswith("Z") and line.endswith("n"):
print(line)
if line.startswith("Z") and line.endswith("t"):
print(line)
main()
正如我所说,它有效,但似乎有点复杂。有关如何缩短的任何提示?
我尝试了line.startswith("Z","W")
和line.endswith("t","n")
,但我得到了一个类型错误(所有切片索引必须是整数或无或者有一个__index__方法)。
答案 0 :(得分:6)
你可以这样做:
line = line.rstrip()
if line and line[0] in "WZ" and line[-1] in "nt":
print(line)
或使用正则表达式:
import re
# ...
if re.match(r'^[WZ].*[nt]$', line):
print(line)
# ^ beginning of string
# $ end of string
# [WX] matches W or X
# .* any character 0 or more times
答案 1 :(得分:3)
startswith
和endswith
也接受元组作为参数(请参阅doc)。
所以这将有效:
line.startswwith(('W', 'Z'))
line.endswith(('t','n'))
您的代码可缩短为:
import sys
def main():
for line in sys.stdin:
line = line.rstrip()
if line.startswith(("W", "Z")) and line.endswith(("n", "t")):
print(line)
main()
答案 2 :(得分:0)
使用regex
。
import re
pattern = '[ZW].*[nt]$'
for line in sys.stdin:
line = line.rstrip()
mo = re.match(p, line)
if mo:
print(line)
模式解释:
[ZW]
匹配两个字符中的一个;因为我们使用re.match
,所以只有当字符串以模式开头时才匹配。所以它必须从Z或W .*
匹配任何内容; char,int,space等一次或多次[nt]$
表示匹配n或t(小写),$
仅当行以结束答案 3 :(得分:0)
或者您可以使用正则表达式
import re
r = re.compile(r^"[WZ].+[nt]$")
m = r.match('Woot')
m.group()
答案 4 :(得分:0)
str.startswith允许你提供一个字符串元组,你必须使用一个元组(“Z”,“W”)而不是“Z”,“W”。
import sys
def main():
for line in sys.stdin:
line = line.rstrip()
if line.startswith(("Z","W")) and line.endswith(("t","n")):
print(line)
main()