如何提取重叠组中最长的项?
我想知道怎么从一串文字中提取以相同方式开头的最长的部分。
比如说,我想从一个给定的字符串中提取出最长的匹配项,可以是“CS”或者“CSI”。
我试过用这个 "(CS|CSI).*"
,结果返回的是“CS”,而不是“CSI”,即使“CSI”是可以匹配的。
如果我用 "(CSI|CS).*"
,那么如果有匹配的话,我就能得到“CSI”。所以我猜解决办法是把较短的部分放在较长的后面。
有没有更清晰的方法来表达这个呢?因为感觉结果会根据我连接这些部分的顺序而变化,有点让人困惑。
4 个回答
0
如果你想知道正确的做法,可以尝试这样构建你的正则表达式:
import re
string_to_look_in = "AUHDASOHDCSIAAOSLINDASOI"
string_to_match = "CSIABC"
re_to_use = "(" + "|".join([string_to_match[0:i] for i in range(len(string_to_match),0,-1)]) + ")"
re_result = re.search(re_to_use,string_to_look_in)
print string_to_look_in[re_result.start():re_result.end()]
3
正如艾伦所说,模式会按照你指定的顺序进行匹配。
如果你想匹配重叠的字符串中最长的那个,你需要把最长的字符串放在最前面。不过,如果你愿意的话,可以自动将你的字符串从最长到最短排列:
>>> '|'.join(sorted('cs csi miami vice'.split(), key=len, reverse=True))
'miami|vice|csi|cs'
5
不,这就是它的工作方式,至少在像Python、JavaScript、.NET等基于Perl的正则表达式中是这样的。