1

对于作业,我必须从以“W”和“Z”开头并以“n”和“t”结尾的文本打印行(因此 Wn、Wt、Zn、Zt 组合)。我现在有一个有效的代码,但它似乎有点长,我想知道是否有办法缩短它?

这是代码:

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__ 方法)。

4

5 回答 5

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

请参阅有关 Python 正则表达式语法的文档

于 2017-09-29T13:07:21.840 回答
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()
于 2017-09-29T13:11:29.977 回答
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(小写),并且$仅当以这些值结尾时才匹配
于 2017-09-29T13:09:18.457 回答
0

或者你可以使用正则表达式

import re

r = re.compile(r^"[WZ].+[nt]$")

m = r.match('Woot')
m.group()
于 2017-09-29T13:11:18.797 回答
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()
于 2017-09-29T13:12:42.047 回答