2016-08-05 39 views
-1

Ich habe die folgende Liste:Überprüfen Sie, ob zwei Strings das gleiche Muster in Python enthalten

names = ['s06_215','s06_235b','s06_235','s08_014','18:s08_014','s08_056','s08_169'] 

s06_235b und s06_235, s08_014 und 18:s08_014 dupliziert. Wie in dem Beispiel gezeigt, gibt es jedoch kein spezifisches Muster in der Benennung. Ich brauche einen paarweisen Vergleich des Elements der Liste zu tun:

for i in range(0, len(names)-1): 
    for index, value in enumerate(names): 
     print names[i], names[index] 

ich dann für jedes Paar überprüfen müssen, wenn die beiden, die gleiche Zeichenfolge enthalten, aber mit einer Länge von mehr als 4. Das ist s06_235b und s06_235 und s08_014 und 18:s08_014 würde dieses Kriterium aber s08_056 und s08_169 würde nicht bestehen.

Wie kann ich dies in Python erreichen?

+0

vielleicht nur durch regulären Ausdruck analysieren, so ist es alles in dem gleichen Muster so etwas wie 's \ d \ d_ \ d {2,3}'? Danach nimmst du einfach uniq Elemente aus deiner Liste –

+1

Du hast deine Beispielstrings falsch geschrieben: 's08_214' und' 18: s08_014' enthalten sich nicht gegenseitig. –

+0

Sorry, korrigierte es – Homap

Antwort

1

Sie können einen 'in' Operator verwenden, um festzustellen, ob auf Variable enthält eine weitere

if "example" in "this is an example": 

Versuchen Sie folgendes:

for i in range(0, len(names)-1): 
    for index, value in enumerate(names): 
     if names[i] in names[index] and len(names[i]) > 4: 
      print names[i], names[index] 

Edit: Als tobias_k erwähnen: Beachten Sie, dass dies nur funktioniert, wenn die Die gesamte Zeichenfolge ist in der anderen Zeichenfolge enthalten.

+0

Beachten Sie, dass dies nur funktioniert, wenn die Zeichenfolge _entire_ in der anderen Zeichenfolge enthalten ist, nicht, wenn sie eine gemeinsame Teilzeichenfolge teilen. Warum mischst du 'range' und' enumerate' so ein? –

+0

@tobias_k. Danke, ich werde die Answear bearbeiten. Ich habe gerade die if-Anweisung in den OP-Code eingefügt, um zu zeigen, wohin es geht. –

2

Sie könnten alle combinations, join sie mit einigen Sonderzeichen Th iterieren at kann nicht Teil dieser Zeichenfolgen sein und eine regular expression wie (\w{5,}).*#.*\1 verwenden, um eine wiederholte Gruppe in diesem Paar zu finden. Anders als nur mit s1 in s2 zu testen, funktioniert dies auch, wenn nur ein Teil der ersten Zeichenfolge in der zweiten enthalten ist oder umgekehrt. Hier

, (\w{5,}) sind die gemeinsamen Teilzeichen von mindestens 5 Zeichen (von der \w Klasse in diesem Fall aber das Gefühl frei anzupassen), gefolgt von mehreren Zeichen .* der Separator (# in diesem Fall), mehr Füllstoff .* und dann eine weitere Instanz der ersten Gruppe \1.

p = re.compile(r"(\w{5,}).*#.*\1") 
for pair in itertools.combinations(names, 2): 
    m = p.search("#".join(pair)) 
    if m: 
     print("%r shares %r" % (pair, m.group(1))) 

Ausgang:

('s06_215', 's06_235b') shares 's06_2' 
('s06_215', 's06_235') shares 's06_2' 
('s06_235b', 's06_235') shares 's06_235' 
('s08_014', '18:s08_014') shares 's08_014' 
('s08_014', 's08_056') shares 's08_0' 
('18:s08_014', 's08_056') shares 's08_0' 

Natürlich können Sie die regex optimieren Sie Ihre Bedürfnisse anzupassen. Wenn z. B. der wiederholte Bereich nicht durch _ begrenzt werden soll, können Sie einen Regex wie p = r"([a-z0-9]\w{3,}[a-z0-9]).*#.*\1" verwenden.