Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字符串搜索_Python_String - Fatal编程技术网

Python字符串搜索

Python字符串搜索,python,string,Python,String,假设我有两个字符串: IAMASTRIPETHA-IWANTTOIGN-RE IAMA-TRIPETHATIWA-TTOIGNORE 如果在本例中忽略“-”的位置,则这两个字符串是相同的。如何在Python 2.7中实现这一点 IAMASTRIPETHA-IWANTTOIGN-RE IAMA-TRIPETHATIWA-TTOALGORE 当忽略“-”时,上述示例与此不同;所以我不在乎 希望有人能帮我;) PS:很抱歉没有提及这一点,但字符串长度不一定相等我不会为您编写完整的解决方案,但会

假设我有两个字符串:

IAMASTRIPETHA-IWANTTOIGN-RE

IAMA-TRIPETHATIWA-TTOIGNORE
如果在本例中忽略“-”的位置,则这两个字符串是相同的。如何在Python 2.7中实现这一点

IAMASTRIPETHA-IWANTTOIGN-RE

IAMA-TRIPETHATIWA-TTOALGORE
当忽略“-”时,上述示例与此不同;所以我不在乎

希望有人能帮我;)


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

我不会为您编写完整的解决方案,但会指导您

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)]
现在,您应该用空字符串替换另一个字符串中的这些索引,并对它们进行比较


此解决方案非常健壮,不会假设任何长度。

我不会为您编写完整的解决方案,但会指导您

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

要查找给定字符串中“-”的位置,可以使用:

get_indexes(st):
     return [m.start() for m in re.finditer('-', st)]
现在,您应该用空字符串替换另一个字符串中的这些索引,并对它们进行比较


此解决方案非常健壮,并且不假设任何长度。

从注释中可以看出,您不在乎字符串长度是否匹配,因此我们不需要测试长度,我们可以使用内置的
zip()
而不是导入
zip\u longest()

输出

True False
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
True False
您可以通过使用Any的单个实例,而不是每次都创建一个新的实例,来提高效率。但是要想得到更好的版本,请看我的答案

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

def ignore_dash_match(s1, s2):
    return all(c1 == c2 for c1, c2 in zip(dash_to_Any(s1), dash_to_Any(s2)))

从注释中可以看出,您不在乎字符串长度是否匹配,因此我们不需要测试长度,我们可以使用内置的
zip()
而不是导入
zip\u longest()

输出

True False
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
True False
您可以通过使用Any的单个实例,而不是每次都创建一个新的实例,来提高效率。但是要想得到更好的版本,请看我的答案

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

def ignore_dash_match(s1, s2):
    return all(c1 == c2 for c1, c2 in zip(dash_to_Any(s1), dash_to_Any(s2)))


str1.replace('-','')==str2.replace('-','')
@MarounMaroun这不是什么wants@vks你确定吗?这就是我所理解的。。如果我没抓住他,请纠正我。@marounnaroun试着跑过去看看。现在我抓住你了。。谢谢。
str1.replace('-','')==str2.replace('-','')
@marounnaroun这不是什么wants@vks你确定吗?这就是我所理解的。。如果我没抓住他,请纠正我。@marounnaroun试着跑过去看看。现在我抓住你了。。谢谢。这个答案很好,也很好pythonic@AnandSKumar见多识广。我在字符串长度上添加了一个条件来解决这个问题。@AnandSKumar您的解释是错误的。问题规范中没有规定字符串必须具有相同的长度才能被视为匹配。只有对应的非连字符是相同的。谢谢你的评论-我要看看它是否适用于我更复杂的情况。我确实不介意字符串是否来自不同的长度。是的,但鉴于要求中不清楚在字符串长度不相等的情况下需要做什么,最好给出一个对两种情况都有效的解决方案,而不是只对一种情况有效的解决方案。特别是因为想出一个对这两种情况都有效的解决方案并不难(一点也不难)。他已经给出了这个解决方案,所以不确定你为什么这么激动。这个答案很好,也很好pythonic@AnandSKumar见多识广。我在字符串长度上添加了一个条件来解决这个问题。@AnandSKumar您的解释是错误的。问题规范中没有规定字符串必须具有相同的长度才能被视为匹配。只有对应的非连字符是相同的。谢谢你的评论-我要看看它是否适用于我更复杂的情况。我确实不介意字符串是否来自不同的长度。是的,但鉴于要求中不清楚在字符串长度不相等的情况下需要做什么,最好给出一个对两种情况都有效的解决方案,而不是只对一种情况有效的解决方案。特别是因为想出一个对这两种情况都有效的解决方案并不难(一点也不难)。他已经给出了这个解决方案,所以不确定你在做什么。我猜它很健壮,但它确实需要对每个字符串进行额外的传递。对于像这样的简单任务,IME正则表达式往往比内置的
str
方法慢。我想它很健壮,但它确实需要对每个字符串进行额外的传递。对于这样的简单任务,IME正则表达式往往比内置的
str
方法慢。