2016-10-19 11 views
0

Ich Kompilieren das folgende Muster:Python Regex findall OR

pattern = re.compile("media.+\.(aac|ts)") 

Meine Idee .ts und .aac Mediendateien in einem String enthalten sind, zu erhalten ist. Die Medien Dateinamen können Medien-u9xuxtkay_213.aac oder Medien-u9xuxtkay_213.ts

Nach dieser akzeptierte Antwort sein Python regular expressions OR Sie verwenden können (|) als ODER Aber ich sehe nicht, wie das ist eine akzeptierte Antwort, da es doenst scheinen mir zu arbeiten:

In [23]: s 
Out[23]: 'Sent from my iPhone' 

In [24]: patt = re.compile("Sent from my (iPhone|iPod)") 

In [25]: patt.findall(s) 
Out[25]: ['iPhone'] 

So nenne ich das findall und ich diese:

In [37]: media 
Out[37]: 'media-u9xuxtkay_213.aac' 

In [38]: pattern = re.compile("media.+\.(aac|ts)") 

In [39]: pattern.findall(media) 
Out[39]: ['aac'] 

ich einen Medien-u9xuxtkay_213.aac statt nur aac bekommen sollte. So wie die angenommene Antwort sollte Sent von meinem iPhone statt nur iPhone

+1

Verwenden Sie 'r" Medien. + \. (?: aac | ts) "', eine nicht einfangende Gruppe. –

+0

Also ist die akzeptierte Antwort in der anderen Frage falsch? – lapinkoira

+0

Nein, wenn Sie es mit 're.finditer' verwenden und' .group() 'greifen. Aber es gibt eine bequemere Sache - eine nicht einfangende Gruppe. –

Antwort

1

zurückgeben Die Klammern fungieren als eine "Erfassungsgruppe", die angibt, was die Regex aus der Zeichenfolge auswählen sollte. Sie können (?:) verwenden, um es zu einer nicht erfassenden Gruppe zu machen, sodass stattdessen die gesamte Zeichenfolge abgerufen wird.

re.compile(r"media.+\.(?:aac|ts)")