如何用Python中的ASCII代码判断另一个字符串的字符串前缀?

问题描述 投票:0回答:2

例如,现在我们有了模式'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 {'?

非常感谢。

python string ascii prefix
2个回答
0
投票

我认为您可以使用.startswith功能?

示例:

names = ['freiburg', 'freicking', 'flensburg', 'freking']
hit = []
pattern = 'frei'
for name in names:
    if name.startswith(pattern):
        hit.append(i)

0
投票

这通过确保要比较的相应字符的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')]
© www.soinside.com 2019 - 2024. All rights reserved.