输入字符串后,例如:'3,11,15,16,35'
如果你想让每个数字代表某些代码的行号,
为了向这些行添加注释,
你会做什么?
更具体地说,在迭代每行代码的for循环中,如何检查字符串以查看它是否包含当前行号。 这是我尝试过的相关部分:
self.num = input('Line(s) to number?')
self.linelist = self.code.splitlines()
for i, element in enumerate(self.linelist):
self.count += 1
# if match(str(self.count) + r",", self.num):
if self.num.find(str(self.count) + ','):
self.final = self.final + element + ' # line ' + str(self.count) + '\n'
else:
self.final = self.final + element + '\n'
re.match
尝试仅对字符串中的第一个行号进行注释
find
尝试似乎与第一个匹配
但会评论与该号码相关联的行以外的所有内容
此设置的另一个问题是,如果列表中有1,
,则可以找到11,
。
答案 0 :(得分:3)
问题是,您在find
语句中直接使用if
的结果。只需看看find
返回的内容:
返回s中找到子字符串sub的最低索引 该sub完全包含在s [start:end]中。失败时返回-1。 开始和结束的默认值以及负值的解释是 与切片相同。
因此,您将获得与integer
对应的第一场比赛的索引或-1
。当您执行if an_integer:
时,它实际上正在执行if bool(an_integer):
。对于bool(an_integer)
,False
为an_integer==0
,对于其他所有内容,True
为else
。这意味着,如果您在输入的开头找到了行号,那么您将在if
部分进行操作,而对于其他所有内容,您将if self.num.find(str(self.count) + ',') >= 0:
部分。您需要执行以下操作:
re.match
表示匹配。
对于re.match
部分,re.search
尝试匹配字符串开头的子字符串。您应该使用11,
代替。
话虽如此,即使有了这些修正,即使使用分隔符,您仍然会遇到不匹配问题。 1,
将匹配11,
和self.num = input('Line(s) to number?').split(",")
# ...
if str(self.count) in self.num:
#...
。要解决此问题,您可以使用分隔符拆分输入并获取值列表。然后,您可以检查该值是否在该列表中:
enumerate
作为一个小旁注,您已经在使用self.count
来获取行号。这应该消除使用计数器(即1
)。如果您希望它们从enumerate
开始,您可以通过提供可选的第二个参数告诉for i, element in enumerate(self.list, 1):
这样做:
i
然后,使用self.count
代替{{1}}。