Ich habe eine Liste von Dateien und versuche, nach einer Teilmenge von Dateinamen zu filtern, die auf 000000, 060000, 120000, 180000 enden. Ich weiß, dass ich eine gerade Zeichenfolgenübereinstimmung durchführen kann, möchte aber verstehen, warum der reguläre Ausdruck Ich habe unter r '[00 | 06 | 12 | 18] +0000' versucht, würde nicht funktionieren (es wird auch MSM_20130519210000.csv zurückgegeben). Ich beabsichtige, dass es entweder mit 00, 06, 12, 18, gefolgt von 0000 übereinstimmt. Wie kann das erreicht werden? Bitte behalten Sie die Antwort im Sinne dieser beabsichtigten Regex anstelle anderer Funktionen bei, danke.

Hier ist das Code-Snippet:

import re

files_in_input_directory = ['MSM_20130519150000.csv', 'MSM_20130519180000.csv', 'MSM_20130519210000.csv', 
'MSM_20130520000000.csv', 'MSM_20130520030000.csv', 'MSM_20130520060000.csv', 'MSM_20130520090000.csv', 
'MSM_20130520120000.csv', 'MSM_20130520150000.csv', 'MSM_20130520180000.csv', 'MSM_20130520210000.csv', 
'MSM_20130521000000.csv', 'MSM_20130521030000.csv', 'MSM_20130521060000.csv', 'MSM_20130521090000.csv', 
'MSM_20130521120000.csv', 'MSM_20130521150000.csv', 'MSM_20130521180000.csv', 'MSM_20130521210000.csv', 
'MSM_20130522000000.csv', 'MSM_20130522030000.csv', 'MSM_20130522060000.csv', 'MSM_20130522090000.csv', 
'MSM_20130522120000.csv', 'MSM_20130522150000.csv', 'MSM_20130522180000.csv', 'MSM_20130522210000.csv', 
'MSM_20130523000000.csv', 'MSM_20130523030000.csv', 'MSM_20130523060000.csv', 'MSM_20130523090000.csv', 
'MSM_20130523120000.csv', 'MSM_20130523150000.csv', 'MSM_20130523180000.csv', 'MSM_20130523210000.csv', 
'MSM_20130524000000.csv', 'MSM_20130524030000.csv', 'MSM_20130524060000.csv', 'MSM_20130524090000.csv', 
'MSM_20130524120000.csv', 'MSM_20130524150000.csv', 'MSM_20130524180000.csv', 'MSM_20130524210000.csv', 
'MSM_20130525000000.csv', 'MSM_20130525030000.csv', 'MSM_20130525060000.csv', 'MSM_20130525090000.csv', 
'MSM_20130525120000.csv', 'MSM_20130525150000.csv', 'MSM_20130525180000.csv', 'MSM_20130525210000.csv', 
'MSM_20130526000000.csv', 'MSM_20130526030000.csv', 'MSM_20130526060000.csv', 'MSM_20130526090000.csv', 
'MSM_20130526120000.csv', 'MSM_20130526150000.csv', 'MSM_20130526180000.csv', 'MSM_20130526210000.csv', 
'MSM_20130527000000.csv', 'MSM_20130527030000.csv', 'MSM_20130527060000.csv', 'MSM_20130527090000.csv', 
'MSM_20130527120000.csv', 'MSM_20130527150000.csv', 'MSM_20130527180000.csv', 'MSM_20130527210000.csv', 
'MSM_20130528000000.csv', 'MSM_20130528030000.csv', 'MSM_20130528060000.csv', 'MSM_20130528090000.csv', 
'MSM_20130528120000.csv', 'MSM_20130528150000.csv', 'MSM_20130528180000.csv', 'MSM_20130528210000.csv', 
'MSM_20130529000000.csv', 'MSM_20130529030000.csv', 'MSM_20130529060000.csv', 'MSM_20130529090000.csv']

print files_in_input_directory
print "\n"

# trying to match any string with 000000, 060000, 120000, 180000
# Question: I use + meaning one or more, and | to indicates the options, but this will match
# 'MSM_20130519210000.csv' as well, and I don't know why
print filter(lambda x:re.search(r'[00|06|12|18]+0000', x), files_in_input_directory)
print "\n"

# This verbose version works
print filter(lambda x:re.search(r'0000000|060000|120000|180000', x), files_in_input_directory)
print "\n"
0
frank 9 Dez. 2013 im 09:36

3 Antworten

Beste Antwort

[00|06|12|18] ist der Zeichensatz , der mit 00|06|12|18 übereinstimmt. Daher stimmt es mit 210000 in "SM_20130519210000.csv" überein, da [00|06|12|18] dem Schreiben von [01268] entspricht. Nicht was du meintest, sollte ich denken.

Anstatt einen Zeichensatz auszudrücken, der ein- oder mehrmals übereinstimmen kann, machen Sie ihn entweder zu einer Erfassungsgruppe

r'(00|06|12|18)0000'

Oder ein negativer Lookbehind-Ausdruck

r'(?<=00|06|12|18)0000'

Sie sind für Ihre Zwecke gleichwertig, da Sie sich nicht für das Spiel oder Gruppen interessieren.

0
roippi 9 Dez. 2013 im 05:46

Wenn Sie versuchen, Dateinamen abzugleichen, die 000000, 060000, 120000 oder 180000 enthalten, dann anstelle von

re.search(r'[00|06|12|18]+0000', x)

Verwenden

re.search(r'(00|06|12|18)0000', x)

Die eckigen Klammern [...] stimmen jeweils nur mit einem einzelnen Zeichen überein, und das Zeichen + bedeutet "Übereinstimmung mit 1 oder mehr des vorhergehenden Ausdrucks".

1
Tim Pierce 9 Dez. 2013 im 05:42

Das Grundproblem hierbei ist, dass Sie die Muster nicht gruppiert haben, sondern einen Zeichensatz erstellt haben, der mit der Verwendung von "[...]" übereinstimmt.

Diese Regex funktioniert: ((000)|(06)|(12)|(18))0000

0
James Mills 9 Dez. 2013 im 05:49