使用正则表达式从单词列表中找出一组单词对

2024-04-29 22:56:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个单词列表,比如:

l = """abc
dfg
hij
jih
gfd
cba
cbd
jip
gfe
jiw
cbw"""

我想从这张单子里找出成对的单词, 所以第一个词是:

^{pr2}$

第二个词是:

\2\1.

所以\1和\2表示第一个单词中的字符。在

我能想到的最好的regexp是:

re.findall('(^.(?P<A>.)(?P<B>.)$)(?=.*(^(?P=B)(?P=A).$))', l, re.DOTALL | re.MULTILINE)

但是这个搜索只返回部分对(因为findall只返回不重叠的结果…)。 然后我考虑使用肯定的lookbehind断言,但是它们只能用于固定长度的字符串。。。在

有没有办法用regex做到这一点?在


Tags: re列表单词gfeabcjipfindallcba
1条回答
网友
1楼 · 发布于 2024-04-29 22:56:12

我怀疑正则表达式是否是一种很好的方法(尤其是在Python中,如果不能像Perl那样简单地获得匹配字符串的所有可能方法,那么必须对字符串的所有前缀调用findall)。一个简单的选择是:

words = l.split()
pairs = set(frozenset((w1, w2)) for w1 in words for w2 in words 
                      if w1[1:] == w2[1::-1])

结果:

^{pr2}$

您还可以通过第一次保存字典中单词的前缀,然后在第二次过程中建立关联来快速解决此问题:

from collections import defaultdict

prefixes = defaultdict(list)
for w in words:
    prefixes[w[1::-1]].append(w) 
pairs = set(frozenset((w1, w2)) for w1 in words for w2 in prefixes[w1[1:]])

它的性能是正则表达式引擎无法比拟的。在

相关问题 更多 >