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
方法慢。