在Python中如何通过ascii码判断另一个字符串的字符串前缀?

How could I judge If a string prefix of another string by ascii code in Python?

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

请注意 table 中 { 紧跟在 z 之后:

ord('z')
# 122

ord('{')
# 123

因此,不考虑低于第一个代码序列或大于第二个代码序列的任何内容。如果您尝试对字符串序列(包括边界)进行排序,这将变得非常清楚:

sorted(['fra', 'frei', 'frei{', 'freidja', 'freia', 'from'])
# ['fra', 'frei', 'freia', 'freidja', 'frei{', 'from']

所以基本上任何以 frei 开头并后跟其他字母的字符串都将小于 'frei{',因为 { 大于 z.

但是,正如 thierry 在评论中提到的,这假定要匹配的后续字符将来自拉丁字母表。来自其他字母表的字符的代码将出现在 { 之后,并且不会落在该边界内。

此外,一个更简单(并且可能是正确的)方法可能是仅使用 str class 中的 startswith,顾名思义,returns 如果字符串以指定的子字符串开头,则为布尔值:

[i for i in name if i.startswith('frei')]