簡體   English   中英

使用正則表達式從單詞列表中查找單詞對

[英]Using Regex to find pairs of words out of a list of words

我有一個單詞列表,例如:

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僅返回不重疊的結果...)。 然后我想到了使用正向后置斷言,但是它們只能與固定長度的字符串一起使用...

有沒有辦法用正則表達式做到這一點?

我懷疑正則表達式是做到這一點的好方法(尤其是在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])

結果是:

>>> map(tuple, pairs)
[('hij', 'jip'), 
 ('abc', 'cbd'), 
 ('dfg', 'gfd'), 
 ('dfg', 'gfe'), 
 ('jiw', 'hij'), 
 ('hij', 'jih'), 
 ('abc', 'cbw'), 
 ('abc', 'cba')]

您還可以通過在第一遍中將單詞的前綴保存在字典中然后在第二遍中建立關聯來真正快速地解決此問題:

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

這樣的性能將很難被正則表達式引擎所擊敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM