如何通过Python中的ascii代码判断另一个字符串的字符串前缀?
Posted
技术标签:
【中文标题】如何通过Python中的ascii代码判断另一个字符串的字符串前缀?【英文标题】:How could I judge If a string prefix of another string by ascii code in Python? 【发布时间】:2020-04-05 15:20:34 【问题描述】:例如,现在我们有模式“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
。它基于(错误的)想法,即“”将在所有字母之后按排序顺序排列。那是错的。例如,'freißenbüttel' < 'frei'
为 false,如果有很多字符,也会发生同样的情况。
是的。我认为所有名称都已转换为拉丁字母。谢谢。
【参考方案1】:
这通过确保要比较的相应字符的 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
因此,低于第一个代码序列或大于第二个代码序列的任何内容都不会被考虑。如果您尝试对字符串序列(包括边界)进行排序,这一点就会变得非常清楚:
sorted(['fra', 'frei', 'frei', 'freidja', 'freia', 'from'])
# ['fra', 'frei', 'freia', 'freidja', 'frei', 'from']
所以基本上任何以frei
开头的字符串都会小于'frei'
,因为大于
z
。
但是,正如 thierry 在 cmets 中所提到的,这假定要匹配的后续字符将来自拉丁字母表。来自其他字母的字符的代码将在 之后,并且不属于该边界。
此外,一个更简单(并且可能是正确的)方法可能是只使用来自str
类的startswith
,正如其名称所示,如果字符串以指定的子字符串开头,则返回一个布尔值:
[i for i in name if i.startswith('frei')]
【讨论】:
感谢您的回答。这个问题的原始内容是我们有一个二叉树(类)来存储关于城市的大量数据(node.key = name, node.value = location),并且我们构建了一个名为lookup(lower,upper)的方法) 在这堂课中。我们需要使用lookup(lower, upper)这个方法来找出哪些城市有给定字符串的前缀(比如'frei')。所以我不能用这个模块开始。但是谢谢你的回答。我想通了。【参考方案2】:我认为你可以使用.startswith
函数?
例子:
names = ['freiburg', 'freicking', 'flensburg', 'freking']
hit = []
pattern = 'frei'
for name in names:
if name.startswith(pattern):
hit.append(i)
【讨论】:
好主意。但是我需要解决一个特殊的问题,所以我还在尝试使用upper和lower。以上是关于如何通过Python中的ascii代码判断另一个字符串的字符串前缀?的主要内容,如果未能解决你的问题,请参考以下文章