由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请帮忙看一个python string comparion的问题,有包子.
相关主题
reverse words, not the Microsoft one!!!grep或egrep怎样输出匹配到的不连续的字符串?
[合集] 一个依赖于平台的memory问题js: 如何确认st1是str2+" \ 0 \ 0 \ 0 " ?
c/c++/java的对象/结构输入a python question
请教如何使用qsort() to sort string.pattern search question in Python
求改进小函数python 正则表达式请教
这个程序怎么解决问个PYTHON烂问题
which str_cmp code is better?A question about c++ pointer
问个缺少逗号的数组赋值问题std::string::reserve()
相关话题的讨论汇总
话题: str2话题: str1话题: mno话题: len话题: python
进入Programming版参与讨论
1 (共1页)
G***y
发帖数: 1082
1
str1 = 'ABCDXYZ'
str2 = 'ABCDMNOXYZ'
两个字符串的两端(ABCD,XYZ)是相同的.ABCD,XYZ,MNO长度不定.请问如何从str1中快速
定位MNO.我需要的output是MNO和它的index(4,6).
多谢,回答有包子.
S*A
发帖数: 7142
2
这个就从头找 matching 然后从尾巴找 matching 就行了。
要符合 Python 精简的风格的话可以用 difflib, 但是
有点杀鸡用牛刀了。
import difflib
print difflib.SequenceMatcher(None, "abcdef", "abcOMGdef").get_opcodes()
结果显示:
[('equal', 0, 3, 0, 3), ('insert', 3, 3, 3, 6), ('equal', 3, 6, 6, 9)]
包子 please.
j*a
发帖数: 14423
3
str3 = 'ABCDMNXOYZ'
这个你要啥结果?典型的dynamic programming.

【在 G***y 的大作中提到】
: str1 = 'ABCDXYZ'
: str2 = 'ABCDMNOXYZ'
: 两个字符串的两端(ABCD,XYZ)是相同的.ABCD,XYZ,MNO长度不定.请问如何从str1中快速
: 定位MNO.我需要的output是MNO和它的index(4,6).
: 多谢,回答有包子.

G***y
发帖数: 1082
4
多谢多谢!包子奉上。
能不能麻烦把“从头找 matching 然后从尾巴找 matching”的code也写一下?刚开始
学python,需要一些基本知识。matching是用regular expression么?
另外一个问题是如果string里有重复怎么办,比如:
str1='ABBBYYZZ'
str2='ABBBBBYYZZYYZZ'
print difflib.SequenceMatcher(None, str1,str2).get_opcodes()
结果显示:
[('equal', 0, 1, 0, 1),
('insert', 1, 1, 1, 3),
('equal', 1, 8, 3, 10),
('insert', 8, 8, 10, 14)]
但我希望的结果是:
[('equal', 0, 3, 0, 3),
('insert', 3, 3, 4, 9),
('equal', 4, 7, 10, 14)]

【在 S*A 的大作中提到】
: 这个就从头找 matching 然后从尾巴找 matching 就行了。
: 要符合 Python 精简的风格的话可以用 difflib, 但是
: 有点杀鸡用牛刀了。
: import difflib
: print difflib.SequenceMatcher(None, "abcdef", "abcOMGdef").get_opcodes()
: 结果显示:
: [('equal', 0, 3, 0, 3), ('insert', 3, 3, 3, 6), ('equal', 3, 6, 6, 9)]
: 包子 please.

G***y
发帖数: 1082
5
这个我要MNXO,3,7
我的要求很简单,提取两头最大match中间的部分。有简单的办法么?
包子送上。

【在 j*a 的大作中提到】
: str3 = 'ABCDMNXOYZ'
: 这个你要啥结果?典型的dynamic programming.

l********a
发帖数: 1154
6
做2个字符串,减去后找0,从第一个0到最后一个0之间的就是需要的
测试代码
>>> str1 = 'ABCDXYZ'
>>> str2 = 'ABCDMNOXYZ'
>>> strCompare1 = str1+'*'*(len(str2)-len(str1))
>>> strCompare2 = '*'*(len(str2)-len(str1))+str1
>>> sc1 = [ord(str2[i])-ord(strCompare1[i]) for i in range(len(str2))]
>>> sc2 = [ord(str2[i])-ord(strCompare2[i]) for i in range(len(str2))]
>>> n1 = sc1.index(0)+sc1.count(0)
>>> n2 = sc2.index(0)
>>> str2[n1:n2]
'MNO'
>>>
2个index, [n1,n2)
n1 = 4
n2 = 7(不包含)
G***y
发帖数: 1082
7
多谢多谢,又学到了。请查收包子。:-)

【在 l********a 的大作中提到】
: 做2个字符串,减去后找0,从第一个0到最后一个0之间的就是需要的
: 测试代码
: >>> str1 = 'ABCDXYZ'
: >>> str2 = 'ABCDMNOXYZ'
: >>> strCompare1 = str1+'*'*(len(str2)-len(str1))
: >>> strCompare2 = '*'*(len(str2)-len(str1))+str1
: >>> sc1 = [ord(str2[i])-ord(strCompare1[i]) for i in range(len(str2))]
: >>> sc2 = [ord(str2[i])-ord(strCompare2[i]) for i in range(len(str2))]
: >>> n1 = sc1.index(0)+sc1.count(0)
: >>> n2 = sc2.index(0)

r****t
发帖数: 10904
8
itertools 的 takewhile 和 dropwhile 对这个问题也很好用
def n_common(str1, str2):
it = takewhile(lambda x: x[0]==x[1], izip(str1, str2))
return len(list(it))
idx1 = n_common(str1, str2)
idx2 = -n_common(str1[::-1], str2[::-1])
这样应该就行了
>>> str2[idx1:idx2]
'MNO'

【在 G***y 的大作中提到】
: str1 = 'ABCDXYZ'
: str2 = 'ABCDMNOXYZ'
: 两个字符串的两端(ABCD,XYZ)是相同的.ABCD,XYZ,MNO长度不定.请问如何从str1中快速
: 定位MNO.我需要的output是MNO和它的index(4,6).
: 多谢,回答有包子.

1 (共1页)
进入Programming版参与讨论
相关主题
std::string::reserve()求改进小函数
请教一个C里面string copy的问题这个程序怎么解决
I like this one.which str_cmp code is better?
xcode for leopard BUG??? help.问个缺少逗号的数组赋值问题
reverse words, not the Microsoft one!!!grep或egrep怎样输出匹配到的不连续的字符串?
[合集] 一个依赖于平台的memory问题js: 如何确认st1是str2+" \ 0 \ 0 \ 0 " ?
c/c++/java的对象/结构输入a python question
请教如何使用qsort() to sort string.pattern search question in Python
相关话题的讨论汇总
话题: str2话题: str1话题: mno话题: len话题: python