【发布时间】:2012-05-01 18:58:12
【问题描述】:
我有一个单词列表,例如:
l = """abc
dfg
hij
jih
gfd
cba
cbd
jip
gfe
jiw
cbw"""
我想从这个列表中找到成对的单词, 所以第一个词是:
.(.)(.)
第二个字是:
\2\1.
所以 \1 和 \2 指的是第一个单词中的字符。
我能想到的最好的正则表达式是:
re.findall('(^.(?P<A>.)(?P<B>.)$)(?=.*(^(?P=B)(?P=A).$))', l, re.DOTALL | re.MULTILINE)
但是这个搜索只返回一些对(因为 findall 只返回不重叠的结果......)。 然后我想到了使用肯定的lookbehind断言,但它们只能与固定长度的字符串一起使用......
有没有办法用正则表达式做到这一点?
【问题讨论】:
-
你能用文字而不是举例来解释这对词之间的关系吗?我想你可能已经失去了一些精度。单词是否总是如图所示正好是 3 个字母?
-
在您的样本数据中,
abc可以与cba、cbd或cbw配对。你有偏好吗?还是您想全部获得? -
@Alan:显然他想得到所有这些,否则正则表达式方法会起作用。
-
@KarlKnechtel:不。列表中的单词可以是任意长度。这对单词之间的唯一关系是它们之间重复的字符。我给出的示例查找了两个应用模式的词 -
.(.)(.),\2\1.。