如何提取重叠组中最长的项?

5 投票
4 回答
3251 浏览
提问于 2025-04-15 22:42

我想知道怎么从一串文字中提取以相同方式开头的最长的部分。

比如说,我想从一个给定的字符串中提取出最长的匹配项,可以是“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的正则表达式中是这样的。

http://www.regular-expressions.info/alternation.html

撰写回答