2016-03-19 9 views
2

Ich habe eine Liste von Zeichenketten wiePython Trunkat String an regex definierten Index

2007 ford falcon xr8 ripcurl bf mkii utility 5.4l v8 cyl 6 sp manual bionic 
2004 nissan x-trail ti 4x4 t30 4d wagon 2.5l 4 cyl 5 sp manual twilight 
2002 subaru liberty rx my03 4d sedan 2.5l 4 cyl 5 sp manual silver 

I die Zeichenkette entweder an der Motorleistung (5.4l, 2.5l) oder Körpertyp (4d wagon trunkieren möchten, 4d Limousine), je nachdem, was zuerst eintritt. Die Ausgabe sollte also lauten:

2007 ford falcon xr8 ripcurl bf mkii utility 
2004 nissan x-trail ti 4x4 t30 
2002 subaru liberty rx my03 

Ich denke, ich werde eine Liste von Wörtern mit .split ('') erstellen. Mein Problem ist jedoch, wie man bei einem x.xl- oder xd-Wort stoppt, wobei x eine beliebige Zahl sein kann. Welche Art von Regex würde dies aufgreifen?

Antwort

2

Eine Möglichkeit wäre, alles aus dem Wort beginnen zu ersetzen, die eine Reihe von l oder eine Zahl, gefolgt von d gefolgt von wagon oder sedan, mit einem leeren String mit re.sub() gefolgt hat:

>>> import re 
>>> 
>>> l = ["2007 ford falcon xr8 ripcurl bf mkii utility 5.4l v8 cyl 6 sp manual bionic ", "2004 nissan x-trail ti 4x4 t30 4d wagon 2.5l 4 cyl 5 sp manual twilight ", "2002 subaru liberty rx my03 4d sedan 2.5l 4 cyl 5 sp manual silver"] 
>>> for item in l: 
...  print(re.sub(r"(\b[0-9.]+l\b|\d+d (?:wagon|sedan)).*$", "", item)) 
... 
2007 ford falcon xr8 ripcurl bf mkii utility 
2004 nissan x-trail ti 4x4 t30 
2002 subaru liberty rx my03 

wo:

  • \b[0-9.]+l\b passen würde ein Wort, die eine weitere Ziffern oder Punkte mit der Endunghat
  • \d+d (?:wagon|sedan) würde eine oder mehrere Ziffern gefolgt von einem Buchstaben d gefolgt von einem Leerzeichen und einem wagon oder sedan übereinstimmen; (?:...) bedeutet eine nicht-einfangende Gruppe
+0

Als Folge auf Frage, wie würde ich begrenzen \ d + d nur zu entsprechen, wenn es sich um eine einzelne Ziffer gefolgt von einem Buchstaben d war? Ich habe versucht \ d {0,1} + d, aber das gibt einen Fehler – Testy8

+0

@ Testy8 sicher, lassen Sie den Quantifizierer in Ruhe: '\ d {1} d'. Vielen Dank. – alecxe

1
^.*?(?=\s*\d+d\s+(?:wagon|sedan)|\s*\d+(?:\.\d+)?l) 

Sie this.See Demo verwenden können.

https://regex101.com/r/aC0uK6/1

import re 
p = re.compile(ur'^.*?(?=\s*\d+d\s+(?:wagon|sedan)|\s*\d+(?:\.\d+)?l)', re.MULTILINE) 
test_str = u"2007 ford falcon xr8 ripcurl bf mkii utility 5.4l v8 cyl 6 sp manual bionic \n2004 nissan x-trail ti 4x4 t30 4d wagon 2.5l 4 cyl 5 sp manual twilight \n2002 subaru liberty rx my03 4d sedan 2.5l 4 cyl 5 sp manual silver " 

re.findall(p, test_str)