Python字符串搜索

2024-10-01 19:14:37 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个字符串:

IAMASTRIPETHA-IWANTTOIGN-RE

IAMA-TRIPETHATIWA-TTOIGNORE

如果在本例中忽略“-”的位置,那么这两个字符串是相同的。如何在Python2.7中实现这一点?你知道吗

IAMASTRIPETHA-IWANTTOIGN-RE

IAMA-TRIPETHATIWA-TTOALGORE

上面的例子在忽略“-”时是不相似的;因此我不在乎。你知道吗

希望有人能帮我;)

PS:很抱歉没有提及这一点,但字符串长度不一定要相等!


Tags: 字符串re例子ps本例tripethatiwaiamaiamastripetha
3条回答

从注释中可以看出,您不关心字符串长度是否匹配,因此我们不需要测试长度,并且可以使用内置的zip()而不是导入zip_longest()。你知道吗

s1 = 'IAMASTRIPETHA-IWANTTOIGN-RE'
s2 = 'IAMA-TRIPETHATIWA-TTOIGNORE'
s3 = 'IAMA-TRIPETHATIWA-TTOALGORE'

def ignore_dash_match(s1, s2):
    return all(c1 == c2 for c1, c2 in zip(s1, s2) if c1 != '-' and c2 != '-')

print ignore_dash_match(s1, s2), ignore_dash_match(s1, s3)

输出

True False

下面是另一种方法,它将每个'-'转换为一个“通配符”对象,该对象比较起来等于任何东西。你知道吗

s1 = 'IAMASTRIPETHA-IWANTTOIGN-RE'
s2 = 'IAMA-TRIPETHATIWA-TTOIGNORE'
s3 = 'IAMA-TRIPETHATIWA-TTOALGORE'

class Any:
    def __eq__(self, other):
        return True

def dash_to_Any(s):
    return [Any() if c == '-' else c for c in s]

print dash_to_Any(s1) == dash_to_Any(s2), dash_to_Any(s1) == dash_to_Any(s3)  

输出

True False

您可以通过使用任意一个实例来稍微提高效率,而不是每次都创建一个新实例。但是要得到更好的版本,请看我对Searching for a partial match in a list of tuples的回答。你知道吗

当然,如果你不在乎不匹配的长度,你可以这样做

def ignore_dash_match(s1, s2):
    return all(c1 == c2 for c1, c2 in zip(dash_to_Any(s1), dash_to_Any(s2)))
a = "IAMASTRIPETHA-IWANTTOIGN-RE"
b = "IAMA-TRIPETHATIWA-TTOIGNORE"

all(x==y or x=="-" or y=="-" for x, y in zip(a, b))
>> True

我不会为你写一个完整的解决方案,但会指导你。你知道吗

您需要获取两个字符串中“-”的索引,并在每个字符串中相应地替换为空字符串。你知道吗

为了在给定字符串中找到“-”的位置,您可以:

get_indexes(st):
     return [m.start() for m in re.finditer('-', st)]

现在应该用空字符串替换另一个字符串中的这些索引,并对它们进行比较。你知道吗

这个解决方案是健壮的,不假设任何长度。你知道吗

相关问题 更多 >

    热门问题