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

5
如何提取以相同方式开头的组中最长的一个?
例如,从给定的字符串中,我想提取与CS或CSI匹配的最长结果。
我尝试过这个代码:“(CS|CSI).*”,但它会返回CS而不是CSI,即使CSI可用。
如果我使用“(CSI|CS).*” ,那么如果它是匹配的话我会得到CSI,所以我猜解决方案是始终将重叠组中更短的放在更长的组之后。
是否有更清晰的方法用re表达这个问题?某种程度上感觉令人困惑的是结果取决于您链接组的顺序。

我认为如果你想使用或运算符,你必须按长度顺序排列它们,最长的先排。除非你有其他的分隔符。或者,你可以反复调用span()直到得到最长的答案,但在将表达式传递给或之前对其进行排序可能更容易。 - iondiode
4个回答

5

谢谢,那个链接对于正则表达式来说非常好,我之前已经看过了。现在我知道我正在正确地做事情。 - user265454

3
正如Alan所说,模式将按照您指定的顺序进行匹配。
如果您想匹配最长的重叠字面字符串,则需要最长的字符串首先出现。但是,如果您愿意,可以自动将字符串从长到短组织起来:
>>> '|'.join(sorted('cs csi miami vice'.split(), key=len, reverse=True))
'miami|vice|csi|cs'

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()]

-1

vim 编辑器中存在类似的功能(“可选匹配原子序列”),例如 col\%[umn] 可以匹配 color 中的 colcolumbus 中的 colum,以及整个的 column

我不确定 Python re 中是否有类似的功能,但你可以使用嵌套的匿名分组,每个分组后面跟着一个 ? 量词来实现:

>>> import re
>>> words = ['color', 'columbus', 'column']
>>> rex = re.compile(r'col(?:u(?:m(?:n)?)?)?')
>>> for w in words: print rex.findall(w)
['col']
['colum']
['column']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接