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