例如,现在我们有了模式'frei',并且我们有一些名称,例如'freiburg','freicking','flensburg'和'freking'。现在,我要判断模式是否是这些名称的前缀(所有字母均为小写)。
有人给了这样的解决方案:
name = ['freiburg', 'freicking', 'flensburg', 'freking']
hit = []
pattern = 'frei'
lower = 'frei'
upper = 'frei{'
for i in name:
if lower <= i <= upper:
hit.append(i)
嗯,我认为这是一个非常狂热的方法。但是我不知道它的原理是什么。有人可以告诉我为什么上下弦看起来像这样吗?为什么在这里使用字符“ {”?我认为'freiburg'的ascii代码之和大于'frei {',但为什么实际上仍小于'frei {'?
非常感谢。
我认为您可以使用.startswith
功能?
示例:
names = ['freiburg', 'freicking', 'flensburg', 'freking']
hit = []
pattern = 'frei'
for name in names:
if name.startswith(pattern):
hit.append(i)
这通过确保要比较的相应字符的unicode码在以下边界之间进行工作:
[ord(i) for i in 'frei']
# [102, 114, 101, 105]
[ord(i) for i in 'frei{']
# [102, 114, 101, 105, 123]
注意,{
在表中的z
之后:
ord('z')
# 122
ord('{')
# 123
但是,正如thierry在评论中所提到的,这假定要匹配的后续字符将来自拉丁字母,因为来自其他字母的字符的代码位于{
之后。
因此不考虑低于第一个代码序列或大于第二个代码序列的任何内容。如果您尝试对字符串序列(包括边界)进行排序,这将变得非常清楚:
sorted(['fra', 'frei', 'frei{', 'freidja', 'freia', 'from'])
# ['fra', 'frei', 'freia', 'freidja', 'frei{', 'from']
因此,基本上,任何以frei
开头,后跟其他字母的字符串都将小于'frei{'
,因为{
大于z
。
话虽这么说,一种更简单的方法可能是只使用startswith
类中的str
,顾名思义,如果字符串以指定的子字符串开头,它将返回一个布尔值:
[i for i in name if i.startswith('frei')]