Python在正则表达式定义的索引处截断字符串

时间:2016-03-19 02:06:14

标签: python regex

我有一个字符串列表,例如

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 

我想在引擎容量(5.4升,2.5升)或车身类型(4d旅行车,4天轿车)上截断字符串,以先到者为准。所以输出应该是:

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

我想我会用.split('')创建一个单词列表。但是,我的问题是如何停止x.xl或xd字,其中x可以是任何数字。什么样的正则表达式会选择这个?

2 个答案:

答案 0 :(得分:2)

一种选择是替换所有内容,从带有数字后跟l或数字后跟d后跟wagonsedan的单词开始,使用re.sub()的空字符串:

>>> 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 

其中:

  • \b[0-9.]+l\b会匹配,其中还有一个以l结尾的数字或点
  • \d+d (?:wagon|sedan)会匹配一个或多个数字,后跟一个字母d,后跟一个空格和wagonsedan; (?:...)表示非捕获组

答案 1 :(得分:1)

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

你可以使用它。参见演示。

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)