所以我有这个列表:
tokens = ['<greeting>', 'Hello World!', '</greeting>']
任务是计算具有 XML 标记的字符串数。 到目前为止,我所拥有的(有效)是这样的:
tokens = ['<greeting>', 'Hello World!', '</greeting>']
count = 0
for i in range(len(tokens)):
if tokens[i].find('>') >1:
print(tokens[i])
count += 1
print(count)
else:
count += 0
让我感到困惑的是,我倾向于将以下行用于 if 语句
if tokens[i].find('>') == True:
但它行不通。 在您看来,编写此循环的最佳方法是什么? 非常感谢! 亚历克斯。
我看到您的方法的一个问题是它可能会捕获误报(例如"gree>ting"
),因此仅检查结束标记是不够的。
如果你对"包含标签"的定义只是意味着检查字符串是否包含一个<
后跟一些字符,那么另一个>
,你可以使用正则表达式(记住这一点,以防你正在考虑更复杂的事情)。
这与@aws_apprentice在评论中提出的紧凑列表生成器方法相结合,为我们提供了:
import re
regex = "<.+>"
count = sum([1 if re.search(regex, t) else 0 for t in tokens])
print(count) #done!
解释:
我们使用的这个单行代码称为列表生成器,它将生成一个包含 1 和 0 的列表。对于tokens
中的每个字符串t
,如果字符串包含标签,则将1
附加到新列表中,否则附加0
。re.search
用于检查字符串(或其子字符串)是否与给定的正则表达式匹配。
以下方法检查字符串开头的开头<
,并检查字符串末尾的>
。
In [4]: tokens = ['<greeting>', 'Hello World!', '</greeting>']
In [5]: sum([1 if i.startswith('<') and i.endswith('>') else 0 for i in tokens])
Out[5]: 2
Anis R. 的答案应该可以正常工作,但这是一个非正则表达式的替代方案(而且不那么优雅。事实上,我会称之为笨拙)。
此代码仅查看克拉的每个列表元素的开头和结尾。我是一个极端的新手,但我认为range(len(tokens))
是多余的,也可以像这样简化。
tokens = ['<greeting>', 'Hello World!', '</greeting>']
count = 0
for i in tokens:
if i[0].find('<') == 0 and i[-1].find('>') != -1:
print(i)
count += 1
print(count)
str.find()
返回一个索引位置,而不是其他人注意到的布尔值,因此您的 if 语句必须反映这一点。没有结果的.find()
返回-1
。如您所见,对于第一克拉,只要您的数据遵循示例列表中的方案,检查索引是否为0
就可以了。第二个 if 组件为负数(使用!=
),因为它检查列表项中的最后一个字符。我认为您不能在那里使用正 if 语句,因为同样,.find()
返回索引位置,并且您的数据可能具有可变长度。我相信您可以通过添加更多代码使检查复杂化,但该快捷方式在您的情况下对我来说似乎令人满意。它唯一不起作用的情况是,您的列表组件看起来像'<greeting> Hello'
很高兴被别人纠正,这就是我在这里的原因。